c# - 从.net core 2.1中间件重定向到控制器动作/视图的正确方法
问题描述
我有一个 .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 存在问题。也可能是因为它在 aTask
而不是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/");
}
});
请注意,这是实现它的一种简单方法,并且使用身份服务等还有更多“核心”方法可以做到这一点
推荐阅读
- mongodb - 如何将所有报告中最新的部分合并到一个主报告中?
- javascript - 使用 vue.js 的电子商务网站上的独立组件
- c# - 生成 JSON 结构
- arrays - 打印出不在数组中的项目。红宝石
- php - “此字段是必需的”作为 Discord API 的响应
- android - Android:将系统主题应用于自定义通知
- openapi - OpenAPI 仅获取一个路径的文档?
- html - 我可以在 Angular Material 表上设置 ngIf else 条件吗?
- sql - 将 Order By 与 Case 语句和 Offset Fetch 一起使用
- javascript - 回显通过 class="" 使用 document.write() 传递的变量