Настройка Identity Server для использования ролей удостоверений ASP.NET - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь узнать больше о Identity Server. В настоящее время я изо всех сил пытаюсь заставить работать авторизацию на основе ролей. Вот шаги, которые я выполнил:

1) Загрузить образец решения: https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity

2) Запустите решение, которое запускается:

a) Проект Identity Server

б) проект MVC

c) Проект API

3) Перейдите к проекту MVC и примените миграции. 4) Зарегистрировать нового пользователя: Bert@Bert.com 5) Просмотрите: CallApiUsingUserAccessToken в проекте MVC. API достигнут ожидаемым образом, поскольку пользователь авторизован.

Скажем, теперь я хочу изменить IdentityContoller из этого:

[Authorize] 
public class IdentityController : ControllerBase 

к этому:

[Authorize(Roles="Admin")] 
public class IdentityController : ControllerBase 

и домашний контроллер (https://github.com/IdentityServer/IdentityServer4.Samples/blob/release/Quickstarts/6_AspNetIdentity/src/MvcClient/Controllers/HomeController.cs) от этого:

public async Task<IActionResult> CallApiUsingUserAccessToken()

к этому:

[Authorize(Roles="Admin")] 
public async Task<IActionResult> CallApiUsingUserAccessToken()

Какие изменения я должен внести в конфигурацию?

Сегодня я попробовал несколько предложений. Например, при запуске MVCClient я попытался добавить:

options.ClaimActions.MapJsonKey("role", "role", "role");
options.TokenValidationParameters.NameClaimType = "name";
options.TokenValidationParameters.RoleClaimType = "role";

Пожалуйста, предположите, что я правильно добавил роли в базу данных удостоверений (и связал роли с пользователями).

1 Ответ

0 голосов
/ 07 ноября 2018

То, что вы ищете, это метод AddProfileService(), где вы можете добавить свою собственную реализацию интерфейса IProfileService, где вы можете настроить заявки для добавления в маркер доступа.

Вот пример использования Identity, который добавляет утверждение о роли к токену

public class ProfileService : IProfileService
{
    protected UserManager<ApplicationUser> _userManager;

    public ProfileService(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var user = await _userManager.GetUserAsync(context.Subject);
        var roles = await _userManager.GetRolesAsync(user);
        var claims = new List<Claim>
        {
            new Claim(JwtClaimTypes.Role, roles.Any() ? roles.First() : "Standard")
        };

        context.IssuedClaims.AddRange(claims);
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        var user = await _userManager.GetUserAsync(context.Subject);
        context.IsActive = (user != null) && user.LockoutEnabled;
    }
}

Затем при запуске скажите idp использовать ваш класс

var builder = services.AddIdentityServer(options =>
                {
                    options.Events.RaiseErrorEvents = true;
                    options.Events.RaiseInformationEvents = true;
                    options.Events.RaiseFailureEvents = true;
                    options.Events.RaiseSuccessEvents = true;
                })
                .AddInMemoryIdentityResources(Config.GetIdentityResources())
                .AddInMemoryApiResources(Config.GetApiResources())
                .AddInMemoryClients(Config.GetClients())
                .AddAspNetIdentity<ApplicationUser>()
                .AddProfileService<ProfileService>();
...