2009-08-14 78 views
7

我正在向ASP.NET MVC應用程序添加授權,並且遇到了路障。我終於能夠連接我們的自定義會員提供商並獲得應用程序的身份驗證。現在,正如所料,如果我將[授權]屬性添加到我的控制器,用戶必須通過身份驗證才能查看頁面。我也成功地測試了[Authorize(Users =「{userName}」)],它也可以將頁面限制爲特定用戶。HttpContext.Current.User.IsInRole(roleName)總是返回false

問題是[Authorize(Roles =「{RoleName}」)]似乎並沒有像我期待的那樣工作。如果我將該屬性添加到控制器,則只要嘗試訪問相應的頁面,我就會重定向到我們的登錄頁面。如果用戶沒有所需的角色,這就是我期望發生的情況,但即使用戶具有該角色也會發生這種情況。我已經在View,Controller和Helper方法中檢查了User.IsInRole(「{roleName}」)和HttpContext.Current.User.IsInRole(「{roleName}」),並且總是返回'False'。

我已驗證我正在使用的用戶具有我想要授權的角色。我還在WebForms應用程序中測試了這些用戶,該應用程序通過相同的角色限制頁面訪問,並且工作正常。我認爲我在某處安裝了某些東西,或者錯過了一些簡單的東西,但是在整個上午搜索後,我沒有發現任何讓我更接近解決方案的東西,所以我希望有人能幫助我。

+0

嘿,你可以編輯你的答案,告訴我們配置是什麼 - 可能在未來幫助其他人。 – sirrocco 2009-08-19 22:44:49

+0

sirrocco - 配置設置特定於我們的實施和環境,因此它們不會對任何人有任何用處。 – Hamman359 2009-08-20 14:48:35

+0

您的評論促使我仔細檢查我的web.config,並且發現roleManager節點已啓用=「false」。我只是想讓人們知道,如果它被禁用,它會返回IsInRole的false,而不是像您期望的那樣返回某種異常。 – 2012-01-06 23:04:35

回答

4

首先:使用探查器並執行HttpContext.Current.User.IsInRole(「{roleName}」)行時,檢查sql查詢是什麼。

如果它沒有進行查詢,那麼你可能有cacheRolesInCookie =「true」,IsInRole將檢查用戶數據的FormsAuthenticationTicket。確保在創建FormsAuthenticationTicket時,將userdata參數設置爲用戶角色的逗號分隔字符串。

+0

謝謝,這並沒有解決問題,但它確實導致我走上了一條最終的道路。事實證明,有一些額外的配置設置需要讓角色提供者完全工作,沒有人打擾告訴我。一旦我偶然發現了這些,一切都「神奇地」開始發揮作用。 – Hamman359 2009-08-19 20:09:22

+1

那是什麼,我有同樣的問題,你能不能讓我知道 – 2014-05-11 13:27:24

0

嘗試清除瀏覽器Cookie緩存。我花了一段時間在類似的問題上敲了敲頭,清理出我的餅乾解決了問題。

0

如果別人發現了這個問題:

我遇到過類似的問題,這個問題是域組中的空間。使用任何HttpContext.Current.User返回,調用IsInRole()似乎使用不包含空格的Windows 2000以前的組名進行比較。

在我的情況下,剝離傳遞給IsInRole()的組名中的空格修復了這個問題。

這裏有一個漂亮的擴展方法來做到這一點:

/// <summary> 
/// Removes all spaces from a string 
/// </summary> 
/// <param name="value">The string</param> 
/// <returns>The string without spaces</returns> 
public static string StripSpaces(this string value) 
{ 
    // my test using both long and short strings showed StringBuilder 
    // to be slightly faster at this than string.Replace() 

    StringBuilder b = new StringBuilder(value); 

    b.Replace(" ", string.Empty); 

    return b.ToString(); 
} 

另外,您可以使用System.DirectoryServices.AccountManagement.UserPrincipal並調用IsMemberOf()這應該包含空格的域組更好地工作。

2

我也有類似的問題,因爲OP。雖然這是一箇舊帖子,但我認爲我會爲我工作。我發現在web.config中禁用了角色提供程序。我設置啓用爲真,它解決了我的問題。

<configuration> 
    <system.web> 
     <roleManager enabled="true" defaultProvider="myRoleProvider"> 
+0

是的,大聲笑,這是做到了。所有這些複雜的解決方案,它變成了一個簡單的開關。謝謝。 – 2013-02-07 23:01:15

1

一個老話題了一點,但我也有類似的問題,原因是:

FormsAuthentication.SetAuthCookie(string, bool) 

我用的是用戶的身份標識(GUID)作爲第一個參數,因爲代碼我正在使用名爲token的變量,但實際上它必須是有效的用戶名。在使用探查器並手動運行aspnetdb存儲的proc後,我發現了這一點。 MSDN文件也證實了這一點。

這也會導致[Authorize(Roles="rolename")]失敗,即使用戶在角色中,但[Authorize]的作品。