Как вернуть 403 вместо перенаправления на доступ запрещен при сбое AuthorizeFilter - PullRequest
0 голосов
/ 31 января 2019

В Startup.ConfigureServices () я настраиваю фильтр авторизации следующим образом:

services.AddMvc(options =>
{
    options.Filters.Add(new AuthorizeFilter(myAuthorizationPolicy));
})

, и я использую либо проверку подлинности с помощью cookie-файлов, либо проверку подлинности AAD на основе конфигурации:

if (useCookieAuth)
{
    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie();
}
else
{
    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
       .AddAzureAD(options => Configuration.Bind("Authentication:AzureAd", options));
}

Теперь, когдаЯ захожу на страницу, и myAuthorizationPolicy не удается, я перенаправлен на «Account / AccessDenied? ReturnUrl =% 2F», но вместо этого я хочу вернуть 403.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Похоже, вам нужно переопределить OnRedirectToAccessDenied

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => {
        options.Events.OnRedirectToAccessDenied = context => {
             context.Response.StatusCode = 403;
        };
    });
0 голосов
/ 01 февраля 2019

Вы можете создать пользовательский Authorization Filter в сочетании с вашей политикой.

public class MyAuthorizeFilter: IAsyncAuthorizationFilter
{
    public MyAuthorizeFilter(string policy)
    {
        Policy = policy;
    }

    public string Policy { get; set; }
    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;

        var authZService = context.HttpContext.RequestServices.GetRequiredService<IAuthorizationService>();
        var accessable = await authZService.AuthorizeAsync(user, null, this.Policy);
        if (!accessable.Succeeded)
        {
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
        }

    }
}

, и теперь вы можете использовать фильтр авторизации для перехвата запроса:

[MyAuthorizeFilter("MyPolicy")]
public IActionResult Index()

или глобально:

services.AddMvc(options =>
        {
            options.Filters.Add(new MyAuthorizeFilter("MyPolicy"));              
        });

Конечно, сначала нужно зарегистрировать политику.

services.AddAuthorization(o => {
            o.AddPolicy("MyPolicy", pb => {
                pb.RequireAuthenticatedUser();
                //...
            });
        });
0 голосов
/ 31 января 2019
public class AuthorizeOrForbidAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpStatusCodeResult(403);
        }

    }
}

Попробуйте фильтр выше.

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