2013-11-21 58 views
18

我有一個ASP.NET MVC 5應用程序。我正在使用標準的ASP.NET身份提供程序進行用戶和角色管理。從自己的存儲庫項目中使用IdentityUser很重要,但這看起來沒問題。我可以註冊,登錄,編輯用戶並管理他們的角色。ASP.NET身份檢查用戶角色不起作用

我添加用戶到角色與這些行:

UserManager.AddToRole(userdetail.Id, r); 
db.Entry(userdetail).State = EntityState.Modified; 
db.SaveChanges(); 

這似乎在DB級別工作。

但是,我不能使用基於角色的身份驗證,實際上

HttpContext.User.IsInRole("Administrator") 

不工作太simples。

[Authorize(Roles="Administrator")] 

不起作用。

我可以用這個方法只檢查,用戶是否是管理員:

UserManager.IsInRole(userID, "Administrator"). 

爲什麼?

在每一個教程中,我發現,一切工作正常。不同的項目存儲庫可能是原因?還是ASP.NET身份被打破了這麼多?

請指教,

+3

我有同樣的問題。任何解決方案 – janhartmann

+0

答案已發佈。接受。一個由jd4u。 – DtechNet

回答

13

似乎有一個問題。[的設計問題]

  • 角色名稱區分在AuthorizeAttribute和User.IsInRole
  • 敏感的角色名稱是區分在UserManager.IsInRole不敏感

此外,檢查正確的角色名稱用於驗證。

[以上是基於使用下面的代碼進行的測試。角色名稱=「管理」,用戶被添加到角色「系統管理員」。]

[Authorize(Roles="Admin")] /*True as "Admin" has A capital as entered in Role name*/ 
public ActionResult Secured() 
{ 
    if (User.IsInRole("admin")) /*This is False*/ 
    { 
     Console.WriteLine("In"); 
    } 
    if(UserManager.IsInRole(User.Identity.GetUserId(), "admin")) /*This is True!!*/ 
    { 
     Console.WriteLine("In"); 
    } 
    return View(); 
} 

如果我們改變屬性[Authorize(Roles="admin")],它重定向到登錄頁面。

+0

你碰巧知道如何繞過這個原因,我有完全相同的問題。我使用自定義用戶和角色存儲,但即時猜測應該注意,但它使用管理器,而不是通過用戶和註釋工作正常。 – Baserz

+0

這救了我的生命我不知道爲什麼這個答案不被接受。沒有別的提到這一點。在Google上查找「Identity userinrole」,你會看到不準確的「User.IsInRole」< - 不起作用!當然,他們是老問題,ASP.NET MVC 5現在已經2歲了,但是很好。如果有人正在編程原始的MVC 5堆棧,那麼就是這樣!可能也適用於.NET CORE。 – DtechNet

+0

在這個區分大小寫只是犯罪,它必須是一個錯誤。我在我自己的代碼中發現了這個,並且在浪費了大量時間之後才發現了這個答案。取消你的答案! –

0

您是否在web.config中有此條目?另外,如果我沒有記錯的話,角色提供程序集在不同版本的.NET中有不同的名稱空間。

+9

您是否在談論最新的ASP.NET MVC 5與ASP.NET身份? – martonx

22

在這種情況下,您需要註銷並再次登錄用戶。

因爲角色數據也存儲在cookie中,所以您必須再次發出cookie來處理它。

+2

您也可以通過更新安全印記來實現同樣的功能,而無需再次登錄和註銷用戶。請參閱http://stackoverflow.com/a/19505060/110871 – Funka

+1

很酷的答案.... –

相關問題