Претензии по отсутствующим ролям в ASP.NET Core 2 и IdentityServer4 - PullRequest
0 голосов
/ 24 сентября 2018

Я прочитал https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler/ о сопоставлении пользовательских утверждений с помощью этой строки кода:

options.ClaimActions.MapUniqueJsonKey("website", "website");

Мне нужно сопоставить роли, и это будет работать, пока у меня не будет только одной роли, такой как " Пользователь".

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

Проблема в том, что у меня более одной роли, например" Пользователь"и" Superadmin". Эта строка кода вызывает исключение:

InvalidCastException: Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken.

У кого-нибудь есть идеи?Я что-то не так или это может быть ошибка?

1 Ответ

0 голосов
/ 25 сентября 2018

Здесь обсуждается этот вопрос:

https://github.com/aspnet/Security/issues/1383

и в том же вопросе возможное решение вашей проблемы с ролью:

https://github.com/aspnet/Security/issues/1383#issuecomment-361505163:

oidcOptions.Events = new OpenIdConnectEvents()
{
  OnUserInformationReceived = async context =>
  {
    // IDS4 returns multiple claim values as JSON arrays, which break the authentication handler
    if (context.User.TryGetValue(JwtClaimTypes.Role, out JToken role))
    {
      var claims = new List<Claim>();
      if (role.Type != JTokenType.Array) {
        claims.Add(new Claim(JwtClaimTypes.Role, (string)role));
      }
      else  {
        foreach (var r in role)
          claims.Add(new Claim(JwtClaimTypes.Role, (string)r));
      }
      var id = context.Principal.Identity as ClaimsIdentity;
      id.AddClaims(claims);
    }
  ...
}
...