ASP.NET Core中如何重定向Microsoft Identity Platform拒绝访问页面
解决方案:自定义授权失败重定向到指定页面
核心问题定位
你当前配置的OpenIdConnectOptions.AccessDeniedPath仅作用于OpenID Connect认证流程中的访问拒绝场景(比如用户拒绝授予应用权限),而你遇到的是授权策略失败(用户缺少对应安全组声明),这个场景由ASP.NET Core的授权中间件控制,默认跳转到Microsoft Identity UI提供的/MicrosoftIdentity/Account/AccessDenied页面。
具体修改步骤
1. 配置授权中间件的访问拒绝路径
在你的ConfigureGroupAuthorization方法中,添加AuthorizationOptions.AccessDeniedPath配置,指定授权失败时的重定向目标:
private static void ConfigureGroupAuthorization( IServiceCollection services, ConfigurationManager configuration) { services.AddAuthorization(p => { p.AddPolicy(PolicyNames.PortalUser, policy => { policy.RequireAuthenticatedUser(); policy.RequireRole(configuration["Groups:PortalUserGroupID"]!); }); }); services.AddAuthorization(options => { options.FallbackPolicy = options.GetPolicy(PolicyNames.PortalUser); options.DefaultPolicy = options.GetPolicy(PolicyNames.PortalUser)!; // 新增:设置授权失败的重定向路径 options.AccessDeniedPath = "/Error/AccessDenied"; }); }
2. 实现自定义错误页面的控制器与视图
确保你已创建ErrorController,并添加AccessDenied操作,用于读取安全组配置并传递到视图:
public class ErrorController : Controller { private readonly IConfiguration _configuration; public ErrorController(IConfiguration configuration) { _configuration = configuration; } public IActionResult AccessDenied() { // 读取需要加入的安全组ID(可扩展为组名称) ViewData["RequiredGroupId"] = _configuration["Groups:PortalUserGroupID"]; return View(); } }
创建对应的视图~/Views/Error/AccessDenied.cshtml,展示提示信息:
@{ ViewData["Title"] = "访问被拒绝"; } <h1>@ViewData["Title"]</h1> <p>你没有访问该系统的权限,请联系管理员加入以下安全组:</p> <p>安全组ID:@ViewData["RequiredGroupId"]</p>
3. (可选)覆盖Microsoft Identity UI默认页面
如果你只想替换默认的/MicrosoftIdentity/Account/AccessDenied页面内容,无需修改重定向路径,可在项目中创建以下路径的视图文件:~/Areas/MicrosoftIdentity/Views/Account/AccessDenied.cshtml
该文件会自动覆盖Microsoft Identity UI提供的默认视图,在其中添加安全组提示即可。
关键说明
- 无需修改Azure应用注册设置,所有配置均在ASP.NET Core应用端完成。
- 区分两个
AccessDeniedPath:OpenIdConnectOptions.AccessDeniedPath:处理认证流程中的访问拒绝(如用户拒绝授权)AuthorizationOptions.AccessDeniedPath:处理授权策略失败(如用户缺少角色/声明)
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

