Haré todo lo posible para explicar mi pregunta.
actualmente estoy trabajando con un requisito en el que el usuario puede iniciar sesión con el usuario de base de datos local y puede iniciar sesión con Azure AD, con el usuario de base de datos local estoy creando un token personalizado usando el código a continuación.
public static string GenerateJwtToken(string userId, string userName, string secret) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(secret); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, userId), new Claim(ClaimTypes.Name, userName) }), Expires = DateTime.UtcNow.AddDays(7), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); var encryptedToken = tokenHandler.WriteToken(token); return encryptedToken; }y validando el token con el siguiente código.
public static IServiceCollection AddJwtAuthentication(this IServiceCollection services, IdentityAppSettings appSettings) { var key = Encoding.ASCII.GetBytes(appSettings.SecretKey); services .AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = false, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false }; }); return services; }y para Azure AD estoy usando el siguiente código en la clase statup.cs
services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");appsettings.json
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "11121313213213132132", "ClientId": "46853216534163", "Audience": "api://11121313213213132132"},
pero arroja el siguiente error "El esquema ya existe: Portador"
ahora mi pregunta es cómo podemos usar varios validadores de tokens juntos, y cómo podemos verificar que el token sea válido de uno para que no debamos verificar en otro validador.
Gracias Chaodeng . Publicar sus sugerencias como respuesta para ayudar a otros miembros de la comunidad.
Necesita eliminar servicios de AddAuthentication
Autenticación de Azure AD con el esquema predeterminado de JWT JwtBearerDefaults.AuthenticationScheme
Aquí está la configuración de muestra
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer("MyAppName",options => { options.Authority = "Value"; options.Audience = "Value"; }) .AddMicrosoftIdentityWebApi(Configuration, "AzureAd");Aquí está el SO para más información