ASP. NET CORE 3.1 Как перенаправить из HandleRequirementAsync - PullRequest
0 голосов
/ 05 мая 2020

Я использую ASP. NET Core 3.1 и context.Resource as 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 вместо страницы «Доступ запрещен»

1 Ответ

0 голосов
/ 17 мая 2020

Я нашел себе решение вышеприведенного вопроса о том, как перенаправить пользователя на страницу реферера после неудачной проверки пользовательской авторизации.

Пожалуйста, если есть лучший способ сделать это, пожалуйста, помогите me.

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 я определил модель publi c свойство

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

3 - В /User/Roles/View.cshtml Я добавил <p>@Model.Message</p> для отображения сообщения пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...