如何为整个Razor Pages应用全局应用AuthorizeForScopesAttribute?
可行解决方案如下
方案1:直接注册全局过滤器(最便捷,全应用生效)
AuthorizeForScopesAttribute本身实现了IFilterMetadata接口,直接作为全局过滤器添加即可,不需要写页面约定:
services.AddRazorPages(options => { // 全局添加Scope校验,所有页面都会生效 options.Filters.Add(new Microsoft.Identity.Web.AuthorizeForScopesAttribute() { ScopeKeySection = "AdminApi:Scope" }); }) .AddMicrosoftIdentityUI();
如果有部分页面不需要该校验(比如公开页、错误页、登录相关页面),直接在对应PageModel上添加[AllowAnonymous]特性即可。
方案2:修正区域/文件夹约定的路径写法
之前约定不生效大概率是路径参数填写错误:AddAreaFolderApplicationModelConvention的第二个参数是对应区域下Pages文件夹的相对路径,不需要带区域名前缀,示例如下:
假设你的区域结构为 Areas/MyArea/Pages/Manage/*,要给Manage下所有页面加特性,写法如下:
services.AddRazorPages(options => { options.Conventions.AddAreaFolderApplicationModelConvention( areaName: "MyArea", folderPath: "/Manage", model => model.Filters.Add(new Microsoft.Identity.Web.AuthorizeForScopesAttribute() { ScopeKeySection = "AdminApi:Scope" })); }) .AddMicrosoftIdentityUI();
如果要给全站非区域页面加,直接用AddFolderApplicationModelConvention,路径填"/"即可。
必要校验项
如果以上方案还是不生效,请检查Program.cs的中间件顺序,必须严格按照以下顺序配置:
app.UseAuthentication(); // 授权中间件必须放在身份验证之后,路由映射之前 app.UseAuthorization(); app.MapRazorPages();
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

