如何在 ASP NET Core 3.1 中的任何控制器的每个方法中 check/redirect?
How to check/redirect in every method of any controller in ASP NET Core 3.1?
我正在寻找一种在每个控制器的每个方法中执行此操作的方法,即使对于那些没有 return IActionResult 的方法(我将在前面讨论这个):
- 获取 User.Claim 以获取登录到站点的用户信息。
- 检查用户是否在数据库中被阻止(我有自己的存储库已经在工作)
- 将用户重定向到显示“您已被阻止”的页面,就像 Exceptions 的工作流程一样。
我已经做过的考虑和尝试:
无法从 Claim 中获取此信息以便与 ViewStart 一起使用,因为我需要该块在更新数据库的同时工作。声明应用户注销并登录。
无法通过 return 是布尔值且 Json 的控制器执行此操作
每个页面,因为用户可以停止重定向
我有几种方法可以 returns 部分视图、对象、列表,除了 IActionResult。我不在乎这是否行不通,原因有二:
- 应该是通过ajax调用的主视图触发的。
- 用户无论如何都被阻止了,所以我不在乎它是否看到页面损坏。
我的安全工作流程是这样的:
[HttpPost]
[Authorize(Policy = "Users")]
[Authorize(AuthenticationSchemes = "MyAppScheme")]
public IActionResult GetRep() {
//Do things
}
现在我正在尝试做一个中间件,但我是 NET Core 的新手,在如此深的层次上,所以两者都无法编译。还试图从 ViewStart
调用我的 userRepository
最好的方法是使用中间件。这里有一个例子:
internal class UserMiddleware
{
private readonly RequestDelegate next;
private readonly IUserRepository userRepository;
public UserMiddleware(RequestDelegate next, IUserRepository userRepository)
{
this.next = next ?? throw new ArgumentNullException(nameof(next));
this.userRepository = userRepository ?? throw new ArgumentNullException(nameof(userRepository));
}
public async Task Invoke(HttpContext httpContext)
{
Claim clientId = httpContext.User.FindFirst(ClaimTypes.NameIdentifier);
bool isBlocked = await this.userRepository.CheckUser(clientId);
if (isBlocked)
{
await httpContext.Response.WriteAsync("You are blocked.");
return;
}
await this.next(httpContext);
}
}
那么在你的启动方法中你应该在映射你的控制器之前调用它:
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other stuff...
app.UseMiddleware<UserMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
我正在寻找一种在每个控制器的每个方法中执行此操作的方法,即使对于那些没有 return IActionResult 的方法(我将在前面讨论这个):
- 获取 User.Claim 以获取登录到站点的用户信息。
- 检查用户是否在数据库中被阻止(我有自己的存储库已经在工作)
- 将用户重定向到显示“您已被阻止”的页面,就像 Exceptions 的工作流程一样。
我已经做过的考虑和尝试:
无法从 Claim 中获取此信息以便与 ViewStart 一起使用,因为我需要该块在更新数据库的同时工作。声明应用户注销并登录。
无法通过 return 是布尔值且 Json 的控制器执行此操作 每个页面,因为用户可以停止重定向
我有几种方法可以 returns 部分视图、对象、列表,除了 IActionResult。我不在乎这是否行不通,原因有二:
- 应该是通过ajax调用的主视图触发的。
- 用户无论如何都被阻止了,所以我不在乎它是否看到页面损坏。
我的安全工作流程是这样的:
[HttpPost] [Authorize(Policy = "Users")] [Authorize(AuthenticationSchemes = "MyAppScheme")] public IActionResult GetRep() { //Do things }
现在我正在尝试做一个中间件,但我是 NET Core 的新手,在如此深的层次上,所以两者都无法编译。还试图从 ViewStart
调用我的 userRepository最好的方法是使用中间件。这里有一个例子:
internal class UserMiddleware
{
private readonly RequestDelegate next;
private readonly IUserRepository userRepository;
public UserMiddleware(RequestDelegate next, IUserRepository userRepository)
{
this.next = next ?? throw new ArgumentNullException(nameof(next));
this.userRepository = userRepository ?? throw new ArgumentNullException(nameof(userRepository));
}
public async Task Invoke(HttpContext httpContext)
{
Claim clientId = httpContext.User.FindFirst(ClaimTypes.NameIdentifier);
bool isBlocked = await this.userRepository.CheckUser(clientId);
if (isBlocked)
{
await httpContext.Response.WriteAsync("You are blocked.");
return;
}
await this.next(httpContext);
}
}
那么在你的启动方法中你应该在映射你的控制器之前调用它:
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other stuff...
app.UseMiddleware<UserMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}