我有一个.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的响应,这只会生成标准的丑陋的“未经授权的页面”,因此我希望有一种更清洁的方式将用户发送到新视图,以便他们可以获取有关访问权限的说明...
我试过
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/");
}
});
请注意,这是实现此目标的简单方法,并且还有更多使用身份服务等实现此目标的“核心”方法