Носитель был запрещен с помощью фильтра авторизации в IdentityServer4

c# authentication asp.net-core authorization identityserver4

4963 просмотра

3 ответа

При тестировании IdentityServer4 с помощью учебника AspNetAuthorization я добавил простую [Authorize(Roles = "Administrator")]и с тех пор получаю эту ошибку:

Схема аутентификации: предъявитель был запрещен.

Мой пользователь имеет это утверждение: new Claim(ClaimTypes.Role, "Administrator", ClaimValueTypes.String).

В ConfigureServicesметоде:

 services.AddAuthorization(options =>
        {
            options.AddPolicy("AdministratorOnly", policy => policy.RequireRole("Administrator"));
        });

        services.AddMvc(config =>
        {
            var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();

            config.Filters.Add(new AuthorizeFilter(policy));
        });

и в Configureметоде:

   app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
        {
            Authority = "http://localhost:5000",
            ScopeName = "openid",
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
            RequireHttpsMetadata = false,
        });

Отладочный вывод:

Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Debug: Executing action LearningEntityServer4.OAuth.ValuesController.Get (LearningEntityServer4.OAuth)
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Information: Authorization was successful for user: myuser.
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Information: Authorization failed for user: myuser.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Warning: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.ChallengeResult: Information: Executing ChallengeResult with authentication schemes ().
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware: Information: AuthenticationScheme: Bearer was forbidden.

Что я пропустил в настройках?

PS: я уже проверил этот пост, но безуспешно.

Автор: Mohsen Afshin Источник Размещён: 08.11.2019 11:01

Ответы (3)


10 плюса

Решение

Наконец-то я нашел время описать, как проверки ролей работают в мире утверждений:

https://leastprivilege.com/2016/08/21/why-does-my-authorize-attribute-not-work/

Вкратце - убедитесь, что типы утверждений, которые вы используете для ролей, соответствуют RoleClaimType в вашем ClaimsIdentity. Или замените RequireRoleна RequireClaimв вашей политике и используйте правильные типы.

Автор: leastprivilege Размещён: 21.08.2016 09:59

0 плюса

В соответствии с приложенным ресурсом кажется, что вы должны поместить имя политики в атрибут авторизации следующим образом [Authorize("AdministratorOnly")].

https://damienbod.com/2016/02/14/authorization-policies-and-data-protection-with-identityserver4-in-asp-net-core/

Автор: hburton Размещён: 20.08.2016 07:49

0 плюса

Фактически, я исправил свою проблему, прежде чем читать подробный ответ @leastprivilege.

Проблема была с наименованием типов претензий,

Я изменил следующее:

new Claim(ClaimTypes.Role, "Administrator");

к этому:

new Claim(JwtClaimTypes.Role, "Administrator");

и авторизация сработала. Это потому, что значения строк между ними различаются, и моя конфигурация ожидала «роль»:

ClaimTypes.Role => "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"
JwtClaimTypes.Role => "role"

или можно сделать это на основе его ответа:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
    {
        Authority = "http://localhost:5000",
        ScopeName = "scope",
        ScopeSecret = "secret",
        AutomaticAuthenticate = true,
        AutomaticChallenge = true,
        RequireHttpsMetadata = false,

        RoleClaimType = "role"

    });

По подробным причинам читайте ответ @leastprivilege

Автор: Mohsen Afshin Размещён: 22.08.2016 08:24
Вопросы из категории :
32x32