2010-07-21 68 views
3

所以,我實現了我的IPrincipal.IsInRole(...),我使用FormsAuthentication像這樣:授權被拒絕的消息與FormsAuthentication

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" name="someName" timeout="600"/> 
</authentication> 

然後我就被驗證,需要你的網頁並且你有「角色A」。這種配置,像這樣:

<location path="SomePage.aspx"> 
    <system.web> 
    <authorization> 
    <allow roles="roleA" /> 
    <deny users="*"/> 
    </authorization> 
    </system.web> 
</location> 

現在,我登錄到我的web應用程序,但不具有roleA用戶。當我訪問SomePage.aspx時,我被重定向到Login.aspx,這是在forms元素的loginUrl中指定的url。所以,我的問題是我不應該能夠指定授權被拒絕的消息或網址?如果用戶已通過身份驗證,但未獲得授權,我爲什麼要重定向到登錄頁面。這對用戶來說太麻煩了。請告訴我,我錯過了一些簡單的事情。

感謝您的閱讀!

回答

1

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

呃,這必須是正確的答案,因爲我希望我不會訴諸這樣的東西:(雖然這有幫助,但我覺得有點愚蠢,非常感謝! – 2010-07-21 15:33:24

+0

我是仍然抱着別人想出更聰明的希望:)當然,理想的解決方案是如果ASP.NET暴露(例如,在Request對象上)引用導致授權失敗的特定角色。 – 2010-07-21 15:41:06

+0

這不會顯示授權的用戶未經授權的消息,但只是沒有登錄,並試圖擊中該URL? – Chris 2013-07-23 16:00:27

1

Roles.IsUserInRole - 如果你只是使用它爲這個頁面,把它放在後面的代碼中。如果你有很多頁面,你可以考慮把它放在一個基類中,然後從web.config或者每個頁面讀取數據庫。我相信這會給你最大的控制力。

0

我基本上同意@MattPeterson的解決方案。但我建議兩個改進。

  1. 在我看來,你只是告訴「根據你的角色,你不允許訪問該頁面」,這就夠了。您不需要知道哪些額外的角色是必需的,哪些會暴露您的網站授權管理的細節。

  2. 您可以從web.config(在每個文件夾中)獲得訪問控制列表,並且無需再次編寫<add key="MemberResources" value="MembershipRequired" />

我相信你應該在你的web.config有類似的東西

<authorization> 
    <deny users="?" /> 
</authorization