Мой API должен принимать токены от:
- Azure AD B2C
- Azure AD (Entra ID)
Код: Выделить всё
DualAuthКод: Выделить всё
services
.AddAuthentication("DualAuth")
// 1. Azure AD B2C
.AddJwtBearer("AzureAdB2cAuth", options =>
{
options.Audience = configuration["AzureAdB2c:Audience"];
options.Authority = configuration["AzureAdB2c:Authority"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = false,
ValidateLifetime = true,
ValidIssuer = configuration["AzureAdB2c:Issuer"],
ValidAudience = configuration["AzureAdB2c:Audience"],
};
})
// 2. Azure AD (Entra ID)
.AddJwtBearer("AzureAdAuth", options =>
{
options.Audience = configuration["AzureAd:Audience"];
options.Authority = configuration["AzureAd:Authority"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
ValidIssuer = configuration["AzureAd:Issuer"],
ValidAudience = configuration["AzureAd:Audience"],
};
})
// 3. Policy Scheme to route token to correct handler
.AddPolicyScheme("DualAuth", "DualAuth", options =>
{
options.ForwardDefaultSelector = context =>
{
string authorization = context.Request.Headers[HeaderNames.Authorization];
if (!string.IsNullOrEmpty(authorization) && authorization.StartsWith("Bearer "))
{
var token = authorization.Substring("Bearer ".Length).Trim();
var handler = new JwtSecurityTokenHandler();
if (handler.CanReadToken(token))
{
var jwt = handler.ReadJwtToken(token);
var issuer = jwt.Issuer;
if (issuer.Equals(configuration["AzureAdB2c:Issuer"], StringComparison.OrdinalIgnoreCase))
return "AzureAdB2cAuth";
}
}
return "AzureAdAuth"; // fallback
};
});
services.AddAuthorization(options =>
{
var commonPolicy = new AuthorizationPolicyBuilder("AzureAdB2cAuth", "AzureAdAuth")
.RequireAuthenticatedUser()
.Build();
options.AddPolicy("DualAuth", commonPolicy);
});
Код: Выделить всё
"AzureAdB2c": {
"Issuer": "https://{mydomain.com}/tenantId/v2.0/",
"Audience": "client-id",
"Authority": "https://{mydomain.com}/4a653a75-4f63-47d8-8705-fdb979d9e578/v2.0/"
},
"AzureAd": {
"Issuer": "https://sts.windows.net/tenantid/",
"Audience": "api://client-id",
"Authority": "https://login.microsoftonline.com/tenantid"
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ion-provid