Я пытаюсь изучить сервер идентификации 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
).
Любые предложения приветствуются, и если вам нужна дополнительная информация о моей настройке, дайте мне знать. Я не хотел раздувать вопрос множеством нерелевантных данных конфигурации.