繁体   English   中英

使用ADFS和ASP.NET MVC时未授权用户将用户重定向到自定义页面

[英]Redirect user to custom page when s/he is not authorized when using ADFS and ASP.NET MVC

我的ADFS配置排除了不属于一组组的所有用户。

在某些情况下,用户使用ADFS登录到Web应用程序(Web应用程序B),并获得了一组声明,这些声明不包含Web应用程序A中接受的任何组。

然后,用户转到Web应用程序A,重定向到ADFS,该用户已经具有ADFS的Cookie,因此不会要求他提供新的用户名/密码组合,并且他将立即以相同的声明(Web应用程序B的声明)进行重定向。到网络应用程序A。

这将触发Web应用程序A中的401,这是正确的。

我们如何将用户重定向到一个说明发生了什么的页面(使用“使用其他帐户登录”按钮)?

作为参考,排除所有不属于一组用户的所有用户的web.config配置为:

<authentication mode="None" />
<authorization>
  <allow roles="GroupA,GroupB,GroupC,GroupD"/>
  <deny users="*" />
</authorization>

指定页面以重定向到401:

<customErrors mode="On">
    <error code="401" path="401.cshtml" />
</customErrors>

在401页中进行授权。

万一有人要处理这个问题,这就是我必须显示自定义未授权页面的方式。

创建一个自定义的未授权页面,也许在其中放一个注销按钮,我将我的内容放到ErrorController中,并将其命名为Unauthorized。

web.config中的第一个“白名单”自定义“您未被授权”页面

<location path="Error/Unauthorized">
    <system.web>
        <authorization>
            <allow Users="*"/>
        </authorization>
    </system.web>
</location>

注意:如果使用重新共享,它将突出显示路径“错误/未经授权”不存在。 只需忽略它,这是因为如果您使用的是Webforms,则该路径将映射到物理文件,但使用MVC则不是这样。

如果要允许用户注销,以便他/她可以使用另一个帐户登录,则还应该设置注销网址,因为对组没有任何要求:

<location path="Home/Logout">
    <system.web>
        <authorization>
            <allow Users="*"/>
        </authorization>
    </system.web>
</location> 

现在,您应该使用“ 401未经授权”(用户已通过身份验证)处理到达“管道”末尾的请求,并将其重定向到自定义未授权页面:

在global.asax中,在EndRequest上注册一个事件并进行检查,将响应更改为302 Found(临时重定向)到自定义未授权页面:

构造函数:

protected MvcApplication(){
  EndRequest+=(s, e) => 
  {
    if (Response.StatusCode == 401 && User.Identity.IsAuthenticated)
    {
      Response.StatusCode = 302;
      Response.Headers.Add("Location", VirtualPathUtility.ToAbsolute("~/Error/Unauthorized"));
    }
  }
}

System.Web.VirtualPathUtility在这里非常有用,因为它可以扩展〜并生成完整的url。

位置标头只是浏览器在收到302响应时使用的标头的名称。 然后,它将对标头值中的url执行一个请求。

我坚信WSFederationAuthenticationModule可以通过web.config中的设置来满足这种情况,但是我确实找不到它。

作为参考,以下是web.config中的所有设置:

<configuration>
 ...
    <location path="Error/Unauthorized">
        <system.web>
            <authorization>
                <allow Users="*"/>
            </authorization>
        </system.web>
    </location>
    <location path="Home/Logout">
        <system.web>
            <authorization>
                <allow Users="*"/>
            </authorization>
        </system.web>
    </location> 
    <system.web>
        <authentication mode="None" />
        <authorization>
           <allow roles="GroupA,GroupB,GroupC,GroupD"/>
           <deny users="*" />
        </authorization>
        ...
    </system.web>
    <system.identityModel>
    ....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM