ASP.NET Core 6与Azure AD自定义登录路径配置咨询
解决自定义登录页触发Azure AD认证的配置方案
1. 调整认证服务核心配置
修改program.cs中的认证流程代码,将默认认证方案切换为Cookie并指定自定义登录路径,同时保留Azure AD的OpenIdConnect配置作为外部认证源:
// 替换原authentication pipeline段代码 var initialScopes = builder.Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' '); builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Login/Index"; // 未认证用户跳转至自定义登录页 options.ExpireTimeSpan = TimeSpan.FromMinutes(30); options.SlidingExpiration = true; }) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi(initialScopes) .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi")) .AddInMemoryTokenCaches();
2. 确认匿名访问权限配置
你已配置/Login文件夹允许匿名访问,可保持现有代码:
builder.Services.AddRazorPages().AddRazorPagesOptions(options => { options.Conventions.AllowAnonymousToFolder("/Login"); options.Conventions.AuthorizeFolder("/"); options.Conventions.AuthorizeFolder("/files"); });
3. 在自定义登录页添加认证触发按钮
在/Login/Index.cshtml中添加触发Azure AD认证的按钮:
<form method="post"> <button type="submit" asp-page-handler="AzureADLogin">使用Azure AD登录</button> </form>
对应在/Login/Index.cshtml.cs中实现认证触发逻辑:
using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace Project.Pages.Login; public class IndexModel : PageModel { public async Task<IActionResult> OnPostAzureADLoginAsync() { // 启动OpenIdConnect认证流程 return Challenge(OpenIdConnectDefaults.AuthenticationScheme); } }
4. 验证全局授权策略
确保Controllers的全局授权策略正确,未认证用户访问受保护路径时会跳转至自定义登录页:
builder.Services.AddControllers(options => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); });
核心逻辑说明
- 将默认认证方案设为Cookie后,未认证用户访问受保护资源时,系统会优先跳转至
LoginPath指定的自定义登录页,而非直接导向Azure AD登录界面。 - 点击登录按钮触发的
Challenge方法会启动Azure AD的OpenIdConnect认证流程,用户完成AD登录后会自动跳转至之前访问的受保护页面(或首页)。 - 原有的Azure AD下游API调用(如Microsoft Graph)配置不受影响,可正常使用。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

