Условная обработка поведения отказа в доступе в ASP.NET Core - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать приложение ASP.Net Core, содержащее контроллеры MVC и API в одном проекте.Для аутентификации я использую IdentityServer4.

В настоящее время, когда пользователь не авторизован для запроса, он всегда перенаправляется на путь Account/AccessDenied независимо от схемы аутентификации.Но я хочу сохранить это поведение только для контроллеров MVC.Для запросов API я просто хочу вернуть код состояния 403.

Конфигурация:

services
    .AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryApiResources(ApiResourceProvider.GetAllResources())
    .AddAspNetIdentity<ApplicationUser>()
    .AddInMemoryClients(clientStore.AllClients);

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.RequireHttpsMetadata = true;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = tokenAuth.Issuer,
            ValidateAudience = true,
            ValidAudience = tokenAuth.Audience,
            ValidateLifetime = true,
            IssuerSigningKey = tokenAuth.SecurityKey,
            ValidateIssuerSigningKey = true
        };
    });

Как мне этого добиться?

Ответы [ 2 ]

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

На самом деле это было довольно просто, но не очевидно: необходимо явно указать схему аутентификации в атрибуте [Authorize].

Я попытался указать [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] на уровне контроллера, но кажется, что установка [Authorize(Roles = RoleHelper.MobileWorker)] на уровне действия переопределяет схему аутентификации. Поэтому я создал пользовательский атрибут, полученный из Authorize, но с правильно установленной схемой аутентификации.

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

Если вы используете куки, вы можете переопределить AccessDeniedPath, как показано ниже

services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            }).AddCookie("Cookies", (options) =>
            {
                options.AccessDeniedPath = "/Authorization/AccessDenied";
            })
...