从.net Core 2.1中间件重定向到控制器操作/视图的正确方法

时间:2018-08-14 12:35:58

标签: c# angular asp.net-core-mvc

我有一个.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的响应,这只会生成标准的丑陋“未经授权的页面”,因此我希望有一种更干净的方法将用户发送到新视图,以便他们可以获取有关访问权限的说明... access denied

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

1 个答案:

答案 0 :(得分:4)

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

否则,由于未认证,您将最终陷入重定向,认证然后重定向的循环。

Configure()的{​​{1}}方法中,您可以有条件地应用身份验证,例如

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()

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