MVC Авторизация роли через OpenId из IdentityServer 4 - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь изучить сервер идентификации 4, и у меня все работает, кроме авторизации ролей в моем MVC клиенте (он отлично работает в моем веб-API через JWT Bearer, который вызывается из моего MVC client).

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

Это (часть) моего MVC клиента StartUp:

.AddOpenIdConnect("oidc", options =>
{
    options.Authority = appSettings.IdentityUrl;
    options.RequireHttpsMetadata = false;

    options.ClientId = "mvc";
    options.ClientSecret = "secret";
    options.ResponseType = "code id_token";

    options.SaveTokens = true;

    options.Scope.Add("web_api");
    options.Scope.Add("offline_access");

    // I was under the impression that was the 'magic' part which mapped claims to roles for use with the Authorize() attribute
    options.ClaimActions.MapJsonKey("role", "role", "role");
}

Это полезная нагрузка access_token, которую я получаю после входа в систему, как вы можете видеть, Роли присутствуют:

{
    "nbf": 1592473463,
    "exp": 1592477063,
    "iss": "https://localhost:5000",
    "aud": "web_api",
    "client_id": "mvc",
    "sub": "b2657e83-4256-4fe2-86e9-3bfa53d462e2",
    "auth_time": 1592473458,
    "idp": "local",
    "is_enabled": "True",
    "role": [
        "Player",
        "Admin"
    ],
    "scope": [
        "openid",
        "profile",
        "web_api",
        "offline_access"
    ],
    "amr": [
    "pwd"
    ]
}

Пример MVC конечная точка контроллера, которая возвращает отказ в доступе:

[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<IActionResult> AuthorisedOnly()
{
    ...SNIP...

    return View("Access", vm);
}

Я предполагаю, возможно, неправильно, что если мой access_token содержит в себе роли , то моя база данных удостоверений и ProfileService настроены правильно. (Я добавляю роли в GetProfileDataAsync из ProfileService).

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

1 Ответ

0 голосов
/ 18 июня 2020

Благодаря статье @RuardvanElburg, упомянутой в его комментарии, я нашел ответ. Не столько сама статья, сколько фрагмент кода, относящийся к TokenValidationParamters, в котором упоминается «роль», которую я видел и подумал, может помочь. Комментарии в статье также помогли мне, гораздо больше, чем основная статья, но это нормально для курса с официальными статьями и документацией по Identity Server!

options.GetClaimsFromUserInfoEndpoint = true;
options.TokenValidationParameters = new TokenValidationParameters
{
    NameClaimType = "name",
    RoleClaimType = "role"
};

//options.ClaimActions.MapJsonKey("role", "role", "role");
options.ClaimActions.MapUniqueJsonKey("role", "role");
...