1

在我UserController.Login行動,我想AddUserToRole()用於身份驗證的用戶,與用戶實體的MembershipType.MembershipName導航屬性的一個值:如何在.Net角色提供程序中設置角色類型文本?

Roles.AddUserToRole(thisUser.UserName, thisUser.MembershipType.MembershipName); 

我不使用臃腫的自動生成的會員種類和只是想將文本值添加到用戶的角色 - 而不是一系列角色。用戶 - >一個角色。

在試圖弄清楚這一點,我定義在web.config中的自定義角色提供:

<roleManager enabled="true" defaultProvider="CustomRoleProvider"> 
    <providers> 
    <clear/> 
    <add name="CustomRoleProvider" 
     type="MyWebsite.CustomRoleProvider, 
      CustomMembershipEF, Version=1.0.0.0, Culture=neutral" 
     connectionStringName="MyDbContext" 
     enablePasswordRetrieval="false" enablePasswordReset="true" 
     requiresQuestionAndAnswer="false" writeExceptionsToEventLog="false" /> 
    </providers> 
</roleManager> 

所以調用Roles.AddUserToRole()調用我的自定義提供的方法,但我不知道該方法要做什麼。

早些時候,我只是簡單地添加到enabled="true"在web.config中的rolemanager部分,但得到以下錯誤:

Unable to find the requested .Net Framework Data Provider. It may not be installed.

這裏是我的自定義角色提供者(雖然我不知道爲什麼我應該需要這個,我只想補充角色名):

public class CustomRoleProvider : RoleProvider 
{ 
    public override bool IsUserInRole(string username, string roleName) 
    { 
     using (var db = new MyApp.DAL.MyAppDbContext()) 
     { 
      var user = db.Users.SingleOrDefault(u => u.UserName == username); 
      if (user == null) 
       return false; 

      if (user.MembershipType != null && user.MembershipType.MembershipName == roleName) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    public override string[] GetRolesForUser(string username) 
    { 
     using (var db = new MyApp.DAL.MyAppDbContext()) 
     { 
      var user = db.Users.SingleOrDefault(u => u.UserName == username); 
      if (user == null) 
       return new string[] { }; 

      return db.MembershipTypes == null ? new string[] { } : 
       db.MembershipTypes.Select(u => u.MembershipName).ToArray(); 
     } 
    } 

    // -- Snip -- 

    public override string[] GetAllRoles() 
    { 
     using (var db = new MyApp.DAL.MyAppDbContext()) 
     { 
      return db.MembershipTypes.Select(r => r.MembershipName).ToArray(); 
     } 
    } 

    // -- Snip -- 

    public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

我想這應該是很簡單的完成 - 簡單地設置用戶的角色名稱...幫助讚賞。

- 更新 -

我註釋掉定製AddUserToRole()方法的內容,用戶可以登錄。但是,在調用操作方法時,角色檢查沒有執行 - 即。應該已經失敗,因爲角色名稱實際上並不存在:

[HttpGet] 
    [AllowAnonymous] 
    [Authorize(Roles="WaitConfirmationxxx")] 
    public ActionResult WaitConfirmation() 
    { 

我也注意到,IsInRole()稱爲自定義GetRolesForUser()方法,做了DB調用它。不完全最佳,並想知道這是否應該是實際?

   if(User.IsInRole("WaitConfirmation")) 
       { 
        // email address has not yet been confirmed 
        return RedirectToAction("WaitConfirmation", "User"); 
       } 

- 更新 -

這裏是我的錯在想,我需要使用Roles.AddUserToRole()(除非有人另有評論)。

我還添加了cacheRolesInCookie參數在roleManager定義在web.config:

<roleManager enabled="true" defaultProvider="CustomRoleProvider" cacheRolesInCookie="true"> 

所以,現在當我打電話if(User.IsInRole("WaitConfirmation")),我的自定義GetRolesForUser(string username)被調用。

現在的問題是沒有Authorization屬性的工作。建議?

回答

0

您需要刪除[AllowAnonymous]屬性,將其更改爲這樣:

[HttpGet] 
[Authorize(Roles="WaitConfirmationxxx")] 
public ActionResult WaitConfirmation() 
{ 

如果您RoleProvider配置正確,它應該踢成這個方法時,它會嘗試從上述方法的屬性授權。

public override string[] GetRolesForUser(string username) 
     { 
+0

是的,我注意到了。經過測試,它似乎都在工作。 – ElHaix

+0

不錯的一個。我已經標記了你的問題。 – hutchonoid

相關問題