You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:12:04