我有一个.NET Core 2.1 / Angular 6应用程序,如果用户不属于安全组,则尝试将其重定向到静态视图。运行该应用程序时,我只会不断收到“错误太多重定向”。

我有一个从securityMiddleWare调用的Startup.cs

public class ADAuthMiddleware
{

    RequestDelegate next;

    public ADAuthMiddleware(RequestDelegate next)
    {

        this.next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        //check if user belongs to AD group or not
        var isAuthorized = httpContext.User.IsInRole("app.users.foo");


        // Return error if the current user is not authorized
        if (!isAuthorized)
        {
            httpContext.Response.StatusCode = 403;
            return;
        }

        // Jump to the next middleware if the user is authorized
        await next(httpContext);
    }

}


现在,我将其设置为返回403的响应,这只会生成标准的丑陋的“未经授权的页面”,因此我希望有一种更清洁的方式将用户发送到新视图,以便他们可以获取有关访问权限的说明... c# - 从.net Core 2.1中间件重定向到 Controller 操作/ View 的正确方法-LMLPHP

我试过httpContext.Response.Redirect(/controller/action)没有运气。
这在带有MVC的完整.NET框架上正常工作。到目前为止,我已经发现.NET Core的问题。也可能是因为它在Task而不是IActionResult内部运行?

最佳答案

您需要在中间件中添加一些逻辑,以确保您不会在重定向用户后再次尝试对用户进行身份验证。

否则,您将陷入重定向,身份验证和重定向的循环,因为它们未经身份验证。

Configure()Startup.cs方法中,您可以有条件地应用身份验证,例如

app.UseWhen(ShouldAuthenticate, appBuilder =>
    {
        appBuilder.UseMiddleware<ADAuthMiddleware>();
    });


并将ShouldAuthenticate定义为:

private static bool ShouldAuthenticate(HttpContext context)
{
    var path = context.Request.Path;
    return !context.Request.Path.StartsWithSegments("/staticpage");
}


对于重定向,您可以使用相同的Configure()方法进行此操作,例如

app.Use(async (context, next) =>
{
    await next.Invoke();
    if (context.Response.StatusCode == 401)
    {
        context.Response.Redirect("/redirectpage/");
    }
});


请注意,这是实现此目标的简单方法,并且还有更多使用身份服务等实现此目标的“核心”方法

07-28 01:04
查看更多