含Microsoft Identity的.NET Angular项目中自定义Razor页面无法继承授权
问题解决:自定义Razor页面无法识别Microsoft Identity用户身份
问题现象
在集成Microsoft Identity的.NET + Angular项目中:
- 新增的
/error/404Razor页面(位于/Pages/ErrorPages目录)无法识别已登录用户,始终显示未认证状态 - 点击顶部菜单的登录按钮,能正常跳转到
/Identity/Account/Login完成认证,但返回自定义页面后身份仍不生效 - Microsoft Identity自带页面(如Account/Login)和Angular页面均可正常识别用户授权状态
- 将该404页面移至
Areas/Identity/Manage目录下时,身份识别恢复正常
核心原因
Identity区域(Areas/Identity)默认继承了专门的认证配置,而主/Pages目录下的页面未正确关联Identity的认证方案,或者Cookie认证的路径/作用域配置限制了身份信息的读取。
具体解决方案
1. 确保Cookie认证的路径为根目录
检查Program.cs中的认证配置,确保Cookie的Path设置为/(默认值,但可能被修改),让Cookie在整个站点生效:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Path = "/"; // 关键:确保Cookie作用域覆盖所有路径 options.LoginPath = "/Identity/Account/Login"; options.LogoutPath = "/Identity/Account/Logout"; });
2. 给自定义Razor页面指定认证方案
由于Identity默认使用Identity.Application作为认证方案,直接在页面或PageModel上指定该方案:
方式一:在Razor页面头部添加特性
@page @model WebApplication1.Pages.ErrorPages._404Model @attribute [Authorize(AuthenticationSchemes = "Identity.Application")] @{ } <h1>404 - THIS PAGE WAS NOT FOUND</h1> @(User.IsInRole("Admin") ? ",AUTHENTICATED" : "NOT AUTHENTICATED")
方式二:在PageModel类上添加特性
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace WebApplication1.Pages.ErrorPages { [Authorize(AuthenticationSchemes = "Identity.Application")] public class _404Model : PageModel { public void OnGet() { } } }
3. 检查中间件顺序
确保Program.cs中的中间件顺序正确,认证中间件必须放在路由和端点之前:
app.UseHttpsRedirection(); app.UseStaticFiles(); // 认证中间件必须在路由之前 app.UseAuthentication(); app.UseAuthorization(); app.UseRouting(); app.MapRazorPages(); app.MapControllers(); app.MapFallbackToFile("index.html"); // Angular的 fallback 路由
4. 统一全局认证配置(可选)
如果项目中Identity区域的_ViewImports.cshtml有单独的认证配置,可将其全局化,让主Pages目录共享:
删除Areas/Identity/_ViewImports.cshtml中除@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers之外的认证相关标签助手,统一在根目录的_ViewImports.cshtml中配置。
验证方法
完成上述配置后,重新登录用户,访问/error/404页面,即可正常显示用户的认证状态。
内容的提问来源于stack exchange,提问作者GerryMM88
相关产品推荐
相关产品推荐

