【问题标题】:ASP.NET CORE 3.1 How to redirect from HandleRequirementAsyncASP.NET CORE 3.1 如何从 HandleRequirementAsync 重定向
【发布时间】:2020-09-23 10:47:05
【问题描述】:

我正在使用 ASP.NET Core 3.1 和 context.Resource,因为 AuthorizationFilterContext 不能用于访问 routeValuesqueryString。我必须使用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


【解决方案1】:

我找到了解决上述问题的方法,即在自定义授权检查失败后如何将用户重定向到引用页面。

如果有更好的方法,请指导我。

1 - 我从HandleRequirementAsync 中删除了以下代码,并让它重定向到 AccessDenied 页面。

    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);
    });

2 - 在 AccessDeniedModel 类中,我添加了以下代码:

    [TempData]
    public string Message { get; set; }

    public void OnGet()
    {
        Message = "Access Denied: You do not have access to this resource.";
        HttpContext.Response.Redirect(HttpContext.Request.Headers["Referer"]);
    }

4 - 在 /User/Roles/View.cshtml.cs 我定义了一个模型公共属性

    [TempData]
    public string Message { get; set; }

3 - 在 /User/Roles/View.cshtml 我添加了&lt;p&gt;@Model.Message&lt;/p&gt; 以向用户显示消息。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2020-11-29
    • 2021-05-24
    • 2017-07-02
    相关资源
    最近更新 更多