我有一个.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
中吗?
答案 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()
请注意,这是一种简单的实现方法,并且还有更多使用身份服务等的“核心”方法。