问题描述
从 .NET Core 3 移植到 .NET Core 5 身份验证,我需要将 services.AddSignIn(已弃用)替换为 services.AddMicrosoftIdentityWebAppAuthentication 或其他相关的 MicrosoftIdentity 扩展。我需要支持 API 访问的 OpenId 用户登录和不记名令牌策略。这些都与 services.AddSignIn 一起使用,但我无法将这种组合与新的 MicrosftIdentity 扩展一起使用。
我有一个带有 OpenId 登录 Azure AD B2C 的 .Net Core Blazor 服务器。这工作正常:
services.AddMicrosoftIdentityWebAppAuthentication(
configuration,aadB2CConfigName,OpenIdConnectDefaults.AuthenticationScheme,CookieAuthenticationDefaults.AuthenticationScheme,true);
但是当我在它之后直接添加 Bearer Token 处理时,如下所示,它会覆盖 OpenId,因此只有 Bearer API 有效(反之亦然):
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(
options =>
{
configuration.Bind("AzureAd",options);
options.ForwardDefaultSelector = ctx =>
ctx.Request.Path.StartsWithSegments("/api",System.StringComparison.InvariantCulture)
? JwtBearerDefaults.AuthenticationScheme
: null;
options.Authority = configuration["AzureAd:Authority"];
options.TokenValidationParameters.NameClaimType = "name";
options.TokenValidationParameters.RoleClaimType = "roles";
},options =>
{
configuration.Bind(aadB2CConfigName,options);
});
为了完整性,其次是(在 .net core 3 中工作正常)
services.AddControllersWithViews()
.AddMicrosoftIdentityUI();
services.AddAuthorization(options =>
{
options.AddPolicy("Tst1AuthPolicy",policy => policy.RequireRole("Tst1AppRole"));
options.AddPolicy("Tst2AuthPolicy",policy => policy.RequireRole("Tst2AppRole"));
});
扩展方法的链接似乎不像使用 AddSignIn 那样工作。 如何在新的 .net core 5 上下文中让这两项再次并行工作?即默认为 OpenId,并在点击 WebApi (/api) 时使用 Bearer Tokens。
谢谢!
解决方法
按如下方式工作。我不完全相信这是这里的预期/最佳用法,但它有效:
将上面的“null”替换为备用登录方案,在我们的例子中是 oreo cookie 方案:
options.ForwardDefaultSelector = ctx =>
ctx.Request.Path.StartsWithSegments("/api",System.StringComparison.InvariantCulture)
? JwtBearerDefaults.AuthenticationScheme
: CookieAuthenticationDefaults.AuthenticationScheme;
这可能意味着,如果不记名令牌失败,我会得到一个 HTML 登录页面,而不是 HTTP 状态错误,所以必须有更好的方法......如果有人愿意插话。