我们已经使用 AzureAd 对 .net 核心 API 进行了身份验证,然后出现了一个新要求,即使用 Auth0 对同一 API 进行身份验证,同时保持现有用户对 AzureAd 的访问。无需选择任何身份验证架构 API 应该能够使用 HTTP 标头中的授权令牌进行身份验证,令牌可以是 Auth0 或 AzureAD。
我发现几篇有用的文章设法使用它们构建了我的解决方案,我认为最好将最终解决方案写在一个地方,这样可能会帮助遇到相同需求的其他人。
以下适用于 Startup.cs(在 ConfigureServices 方法中)
添加多个身份验证方案
我们需要注册一个 JWT 承载认证作为默认的认证方案。第二个注册了一个唯一的名字。
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Audience = "dgdf7g6967-97fdgd";
options.Authority = "https://login.microsoftonline.com/myazure.abc.com";
})
.AddJwtBearer("Auth0", options =>
{
options.Audience = "myweb.abc.com";
options.Authority = "https://my.auth0.com";
});
}
然后我们需要更新默认授权策略以接受两种身份验证方案。
services.AddAuthorization(options =>
{
var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme, "Auth0");
defaultAuthorizationPolicyBuilder =
defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});
完成后,您需要为两个模式添加 AddIdentities。我创建了单独的中间件来处理这个
MultipleSchemaAuthenticationMiddleware.cs
public async Task InvokeAsync(HttpContext context)
{
var principal = new ClaimsPrincipal();
var resultAzureAD = await context.AuthenticateAsync();
if (resultAzureAD?.Principal != null)
{
principal.AddIdentities(resultAzureAD.Principal.Identities);
}
var resultAuth0 = await context.AuthenticateAsync(AppHelper.Settings.Auth0.SchemaName);
if (resultAuth0?.Principal != null)
{
principal.AddIdentities(resultAuth0.Principal.Identities);
}
context.User = principal;
await _next(context);
}
并在 Startup.cs 中注册中间件(在 Configure 方法中)
app.UseMiddleware<MultipleSchemaAuthenticationMiddleware>();