【发布时间】:2020-09-23 10:47:05
【问题描述】:
我正在使用 ASP.NET Core 3.1 和 context.Resource,因为 AuthorizationFilterContext 不能用于访问 routeValues 或 queryString。我必须使用IHttpContextAccessor 来获取routeValues["id"] 但IHttpContextAccessor 没有Result 属性来设置RedirectToPage("/View", new {id = "...."})
public class NoEditOrDeleteSuperUserHandler : AuthorizationHandler<ManageSuperAdminRequirement>
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly UserManager<ApplicationUser> _userManager;
public NoEditOrDeleteSuperUserHandler(IHttpContextAccessor httpContextAccessor, UserManager<ApplicationUser> userManager)
{
this._httpContextAccessor = httpContextAccessor;
this._userManager = userManager;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ManageSuperAdminRequirement requirement)
{
var userId = _httpContextAccessor.HttpContext.Request.RouteValues["id"].ToString();
var selectedUser = _userManager.FindByIdAsync(userId).GetAwaiter().GetResult();
if (_userManager.IsInRoleAsync(selectedUser,"SuperAdmin").GetAwaiter().GetResult() == false)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
context.Fail();
var Response = _httpContextAccessor.HttpContext.Response;
var message= Encoding.UTF8.GetBytes("User with Super Admin role cannot be edited");
**// return RedirectToPage("/View", new {id = id});**
Response.OnStarting(async () =>
{
_httpContextAccessor.HttpContext.Response.StatusCode = 429;
await Response.Body.WriteAsync(message, 0, message.Length);
});
return Task.CompletedTask;
}
}
我正在使用自定义策略授权,当授权失败时,我想将用户重定向到 returnUrl 而不是拒绝访问页面
【问题讨论】:
-
Context.Resource 无法转换为 AuthorizationFilterContext 它返回 null。我以前尝试过这个解决方案。我必须注入 IHttpContextAccessor 才能访问 queryStrings
标签: c# asp.net-core-3.1