我正在创建一个 .net-core2 web-api,它允许 Azure-AD 中的用户使用它。该 API 是多租户的,因此来自多个 Azure-AD 的用户应该能够授权。
但是,也可以为没有企业 Azure-AD 帐户的用户创建帐户。这些用户存储在数据库中(本地用户)。
因为它是一个 web-api,所以我实现了一个自定义令牌提供程序,以便本地用户可以获得令牌来使用受保护的 web-api。
但是,我无法向 web-api 添加两个单独的“承载”身份验证:
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddAzureAdBearer(options => Configuration.Bind("AzureAd", options))
.AddJwtBearer(options => new JwtBearerOptions {
TokenValidationParameters = tokenValidationParameters
});
这会引发错误:
System.InvalidOperationException:方案已存在:承载者
我完全理解。但是我如何并行实现这两种身份验证机制呢?
您必须指定不同的标识符。目前两者都使用“Bearer”标识符。
例如,您可以通过以下方式为 JWT Bearer 指定不同的 JWT Bearer:
.AddJwtBearer("CustomJwt", options => { });
这解决了标识符冲突的问题,但为了并行支持两种身份验证方案,您将需要进行额外的修改。
David Fowler 提出了 2.0 中的一种方法:https://github.com/aspnet/Security/issues/1469 https://github.com/aspnet/Security/issues/1469
app.UseAuthentication();
app.Use(async (context, next) =>
{
// Write some code that determines the scheme based on the incoming request
var scheme = GetSchemeForRequest(context);
var result = await context.AuthenticateAsync(scheme);
if (result.Succeeded)
{
context.User = result.Principal;
}
await next();
});
在您的情况下,如果您点击中间件时上下文中没有用户,您可以使用所有 Bearer (Azure AD) 方案。
在 ASP.NET Core 2.1 中,我们将获得“虚拟身份验证方案”,它以更一流的方式允许这种情况:https://github.com/aspnet/Security/pull/1550 https://github.com/aspnet/Security/pull/1550
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)