ASP.NET Основные и веб — токены JSON- Сопоставление пользовательских утверждений

#asp.net-core #azure-active-directory #jwt

Вопрос:

ASP.NET Ядро имеет собственное сопоставление со стандартными утверждениями. Прочтите это и взгляните на этот репозиторий GitHub

Я использую Azure AD, NET5.

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

Код для обработки повторяющихся утверждений об именах.

 string email = null;
var nameClaims = httpCtx.User
                        .FindAll(x => x.Type.Equals(ClaimTypes.Name))
                        .Where(x => x.Value.Contains("@")).ToList();
if(nameClaims.Any())
{
  email = nameClaims.First().Value;
}     
 

Код для добавления авторизации.

 services  
 .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
 .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
 options.Authority = openIdConnectOptions.Authority;
 options.TokenValidationParameters.ValidIssuer = openIdConnectOptions.ValidIssuer;
 options.TokenValidationParameters.ValidAudiences = openIdConnectOptions.ValidAudiences;
 options.MapInboundClaims = true;
});
 

Если вы установите значение MapInboundClaims = false, то теперь будут сопоставления, и все утверждения сохранят там имена.
Это решает мою проблему с утверждением о дублировании имени, но также нарушает способ сопоставления ролей и их использования в ASP.NET Ядро.

Я хотел бы сохранить отображение по умолчанию и добавить свое собственное для типов, которые, как я знаю, отображаются неправильно. Или удалите все сопоставления и добавьте недостающие части, чтобы роли снова заработали.

Комментарии:

1. Вы можете управлять статическим JwtSecurityTokenHandler.DefaultInboundClaimType словарем, чтобы настроить сопоставление по умолчанию.

2. «[…] но также разбейте, как роли сопоставляются и используются в ASP.NET Ядро». Это не связано с ASP.NET Ядро, но к какому утверждению по умолчанию использует ClaimsIdentity, чтобы определить, к какой роли(ролям) принадлежит пользователь. Если вы отключите сопоставление утверждений, утверждения «роль» останутся как есть, поэтому вам нужно указать стеку JWT использовать это утверждение вместо этого. Вы можете сделать это с options.TokenValidationParameters.RoleClaimType = "role"; помощью . Вы можете сделать то же NameClaimType самое, если сопоставление имен также нарушено.

Ответ №1:

Вот что у меня получилось. Теперь имена утверждений не изменяются. За исключением ролей. Мне нужно было добавить имена утверждений MS, чтобы заставить роли работать в моем сопоставлении политик.

 using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Logging;

namespace EmployeeTrading.Server.Extensions
{
    public static partial class ServiceCollectionExtensions
    {
        public static IServiceCollection AddBearerAuthentication(this IServiceCollection services,
            OpenIdConnectOptions openIdConnectOptions)
        {
#if DEBUG
            IdentityModelEventSource.ShowPII = true;
#endif
            // // https://mderriey.com/2019/06/23/where-are-my-jwt-claims/
            // https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/a301921ff5904b2fe084c38e41c969f4b2166bcb/src/System.IdentityModel.Tokens.Jwt/ClaimTypeMapping.cs

            services
                .AddAuthentication("Bearer")
                .AddJwtBearer("Bearer", o =>
                {
                    o.Authority = openIdConnectOptions.Authority;
                    o.TokenValidationParameters.ValidIssuer = openIdConnectOptions.ValidIssuer;
                    o.TokenValidationParameters.ValidAudiences = openIdConnectOptions.ValidAudiences;
                    o.MapInboundClaims = false;
                    o.TokenValidationParameters.RoleClaimType = "roles";
                });

            return services;
        }
    }
}