请参阅下面的更新
我正在使用 Azure AD B2C,希望我的用户能够通过我的 Web 应用程序登录,并能够利用 JWT 不记名令牌并从移动应用程序调用 Web API 方法。
我可以让任一身份验证方案自行工作。例如,在我的startup.cs中我可以执行以下操作:
services
.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)
其按预期工作(用户可以登录网站,但 JWT 不起作用)。
或者,我可以使用以下内容,然后只有 JWT 不记名令牌才可以工作:
services
.AddAuthentication(AzureADB2CDefaults.JwtBearerAuthenticationScheme)
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)
如果我想要其中任何一个工作,我可以执行以下操作(在/sf/answers/3479447331/的帮助下)
services
.AddAuthentication()
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options))
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(AzureADB2CDefaults.AuthenticationScheme, AzureADB2CDefaults.JwtBearerAuthenticationScheme)
.Build();
}
Run Code Online (Sandbox Code Playgroud)
现在两者都可以工作。(编辑:实际上,它们并不能完全工作)
但是,我也有这个代码:
app.UseAuthentication();
app.UseMiddleware<MyAfterAuthenticatedMiddleware>();
app.UseAuthorization();
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用任一身份验证的组合时,当我的中间件代码运行时,我的用户未经过身份验证(在中间件代码中)并且没有声明等,但稍后在管道中获取它们。
这里发生了什么事?如何解决这个问题?
看来,当我不指定默认身份验证方案时(为了拥有多个方案),直到管道中的授权步骤时,身份验证才会发生。
我需要我的中间件在身份验证之后和授权之前运行。如何通过多种身份验证方案实现这一点?
更新——解决了!但一定有更好的方法!
首先,我要向那些创建 .NET 安全产品的人们表示敬意。这很重要,也很困难。但我确实认为可能还有很大的改进空间。
大多数开发人员在必要时都会涉足安全领域,然后又回到他们的“常规”工作中。除非你每天都使用它,否则很难保持领先。每次你回到它时,一切都会再次改变。
这一定是一个常见的场景:我希望我的用户能够登录我的网站并与各种 Web API 方法进行交互。我希望他们也能够通过其他方式访问这些相同的 API …