![](/img/trans.png)
[英]Redirect to another page when user is not authorized in asp.net mvc3
[英]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.