如何基于Azure Active Directory安全组控制Razor Page内容可见性与访问权限
前置配置
首先你需要先在Azure AD应用注册中完成组声明配置,让用户登录后令牌中携带所属安全组信息:
- 进入Azure Portal的「Azure Active Directory」-「应用注册」,找到你的项目对应的应用
- 左侧菜单选择「令牌配置」,点击「添加组声明」
- 勾选「安全组」,根据你的需要选择返回组的Object ID(推荐,稳定性更高)或sAMAccountName(组名),保存配置
问题1:仅向APP-Administrator用户组的用户展示Settings页面链接
完成上述配置后,你可以在Index.cshtml中通过判断当前用户的所属组权限,动态渲染链接:
- 先在
Program.cs中配置角色声明映射,简化权限判断逻辑:
builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options => { // 指定角色声明对应令牌中的groups字段 options.TokenValidationParameters.RoleClaimType = "groups"; });
- 在
Index.cshtml中加入权限判断逻辑:
@if (User.IsInRole("这里替换为APP-Administrator组的Object ID或组名")) { <a asp-page="Settings">设置</a> }
非管理员用户访问Index页面时,不会看到这个链接。
问题2:阻止非管理员用户直接通过URL访问Settings页面
有两种常用实现方式,选其一即可:
方式1:通过Authorize特性直接标记页面
在Settings.cshtml.cs的PageModel类上添加[Authorize]特性,指定允许访问的角色:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.RazorPages; [Authorize(Roles = "这里替换为APP-Administrator组的Object ID或组名")] public class SettingsModel : PageModel { // 页面原有逻辑 }
方式2:通过 Razor Pages 约定全局配置
适合需要统一管理多页面权限的场景,在Program.cs中添加配置:
// 先添加授权策略 builder.Services.AddAuthorization(options => { options.AddPolicy("AdministratorOnly", policy => policy.RequireRole("这里替换为APP-Administrator组的Object ID或组名")); }); // 给Settings页面绑定授权策略 builder.Services.AddRazorPages() .AddRazorPagesOptions(options => { options.Conventions.AuthorizePage("/Settings", "AdministratorOnly"); });
配置完成后,非管理员用户直接访问Settings页面URL时,会自动返回403禁止访问错误。
注意:如果用户所属安全组超过200个,Azure AD不会在令牌中返回全量组列表,这种场景你需要调用Microsoft Graph API查询用户是否属于目标组,再做权限判断。
内容的提问来源于stack exchange,提问作者Praveen Kumar
相关产品推荐
相关产品推荐

