如果有人不得不处理这个问题,这就是我要显示自定义未经授权页面的方式。
创建一个自定义的未经授权的页面,也许在那里放一个注销按钮,我把我的放在 ErrorController 中并将动作命名为 Unauthorized。
首先将 web.config 中的自定义“您未被授权”页面“列入白名单”
<location path="Error/Unauthorized">
<system.web>
<authorization>
<allow Users="*"/>
</authorization>
</system.web>
</location>
注意:如果您使用 resharper,它将突出显示“错误/未授权”路径不存在。忽略它,这是因为如果您使用网络表单,该路径将映射到物理文件,但使用 MVC 时,情况并非如此。
如果您想允许用户注销以便他/她可以使用其他帐户登录,您还应该设置一个注销 url 对组没有任何要求:
<location path="Home/Logout">
<system.web>
<authorization>
<allow Users="*"/>
</authorization>
</system.web>
</location>
您现在应该使用 401 Unauthorized 处理到达“管道”末端的请求,其中用户已通过身份验证,并将它们重定向到自定义未经授权的页面:
在 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>
....