我有一个应用程序设置,可以使用 Microsoft.Identity.Web 包通过 Azure AD 进行 OIDC 身份验证。
配置为:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options => {
configuration.Bind("AzureAd", options);
});
和
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
但是,当应用程序加载并且浏览器导航到 https://localhost:1524/ 时,我会自动重定向到 Azure AD 登录,尽管 HomeController 具有 AllowAnnonymous。
如果我明确访问 HomeController,即 https://localhost:1542/home/index,则页面无需身份验证即可加载。
为什么默认 URL 会导致身份验证启动?
我期望加载默认路由而不重定向到 Azure AD
为什么默认 URL 会导致身份验证启动?我是 期望加载默认路由而不重定向到 Azure AD
如果您也可以共享您的控制器,那就太好了。根据您在 program.cs 代码中调用
app.UseAuthentication()
和 app.UseAuthorization()
的场景,应用程序在到达控制器之前会经过身份验证和授权管道。
如果您的
HomeController.Index
操作未明确指定任何授权要求(如 [AllowAnonymous]
),则会启动默认行为,即根据配置的身份验证方案(在本例中为 Azure AD)检查经过身份验证的用户。
为了解决您的问题,您可以按照以下任一方式操作:
如果您的控制器没有
[AllowAnonymous]
注释,您可以使用它。
另一种方法可以是在身份验证配置中对默认路由使用特定路由排除。您可以通过修改
AddMicrosoftIdentityWebApp
选项来指定要从身份验证中排除的路由模式来实现此目的。所以你可以这样做:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>
{
configuration.Bind("AzureAd", options);
options.ExcludedPaths.Add("/");
});
注意: 请记住,通过添加
options.ExcludedPaths.Add("/");
,您将告诉身份验证中间件跳过对根路径(“/”)的请求的身份验证
此外,使用您已删除的授权策略也可以帮助解决该问题。在这种情况下,您可以修改您的政策,如下所示:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AllowAnonymous", policy => policy.Requirements.Add(new AllowAnonymousRequirement()));
});
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}",
defaults: new { policy = "AllowAnonymous" });
注意: 通过上述修改,索引操作将指示授权中间件跳过检查此特定操作的身份验证,从而允许匿名访问。如果您想了解更多,请参考这个官方文档。