是的,这有点烦人。也许有人有一个更简单的想法,但我们提出的解决方案(黑客?)是查找当用户重定向到登录页面时ASP.NET附加到查询字符串的最初请求的URL。
我们创建了存储一组密钥的重定向URL的片段匹配到授权消息/值的新的web.config部分:
<configSections>
<section name="authorizationFailureMessages" type="System.Configuration.NameValueSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
...etc...
</configSections>
<authorizationFailureMessages>
<add key="MemberResources" value="MembershipRequired" />
<add key="Staff" value="StaffOnly" />
<add key="Departments/Administration/BoardOfDirectors" value="BoardOfDirectorsOnly" />
...etc...
</authorizationFailureMessages>
在登录的的Page_Load()事件。 aspx页面,我们称使用该URL来确定方法,(联合国)授权事件发生然后将其重定向到显示相应的文本消息页:
private void DisplayAppropriateAuthorizationMessage()
{
if (!Page.User.Identity.IsAuthenticated)
return;
string redirectUrl = FormsAuthentication.GetRedirectUrl(Page.User.Identity.Name, false);
if (string.IsNullOrEmpty(redirectUrl))
return;
NameValueCollection authorizationFailureMessages = ConfigurationManager.GetSection("authorizationFailureMessages") as NameValueCollection;
if (authorizationFailureMessages == null)
return;
foreach (string key in authorizationFailureMessages.AllKeys)
{
if (redirectUrl.Contains(key))
{
Response.Redirect(String.Format("Message.aspx?{0}={1}", Constants.QueryStringKeys.ERRORMESSAGENAME, authorizationFailureMessages[ key ]), true);
}
}
}
呃,这必须是正确的答案,因为我希望我不会诉诸这样的东西:(虽然这有帮助,但我觉得有点愚蠢,非常感谢! – 2010-07-21 15:33:24
我是仍然抱着别人想出更聪明的希望:)当然,理想的解决方案是如果ASP.NET暴露(例如,在Request对象上)引用导致授权失败的特定角色。 – 2010-07-21 15:41:06
这不会显示授权的用户未经授权的消息,但只是没有登录,并试图击中该URL? – Chris 2013-07-23 16:00:27