是的,這有點煩人。也許有人有一個更簡單的想法,但我們提出的解決方案(黑客?)是查找當用戶重定向到登錄頁面時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