2015-05-12 78 views
0

我有我的數據庫中用戶的角色(主管理員,管理員,開發人員)的用戶表。我想授權一些控制器 ,所以只有主管理員才能訪問。與聲明的自定義角色提供者

namespace TicketSystem.Controllers 
{ 
    public class UserCredentials : ClaimsPrincipal, IIdentity, IPrincipal 
    { 
     public IIdentity Identity { get; private set; } 
     public int UserId { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string[] roles { get; set; } 

     public string email { get; set; } 

     override 
     public bool IsInRole(string role) 
     { 
      if (roles.Any(r => role.Contains(r))) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     public UserCredentials() { } 
     public UserCredentials(ClaimsPrincipal principal) 
      : base(principal) 
     { 
     } 

     public UserCredentials(int userId, string email, string firstName, string lastName, string[] roles) 
     { 

      this.Identity = new GenericIdentity(email); 
      this.UserId = userId; 

      this.email = email; 
      this.FirstName = firstName; 
      this.LastName = lastName; 
      this.roles = roles; 

     } 


     override 
     public string ToString() 
     { 
      return UserId + ""; 
     } 

    } 
} 

這是我的登錄方法

UserCredentials loggedUser = null; 
User loginUser = db.tblUser.Where(x => x.email == model.UserName).FirstOrDefault(); 
loggedUser = new UserCredentials(loginUser.idUser, 
       loginUser.email, loginUser.firsName, loginUser.lastName, new string[] { loginUser.role }); 
if (loggedUser != null) 
{ 
    var identity = new ClaimsIdentity(new[] { 
        new Claim(ClaimTypes.Name, loggedUser.email), 
        new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", User.Identity.AuthenticationType), 
        new Claim(ClaimTypes.NameIdentifier, loggedUser.FirstName), 
        new Claim(ClaimTypes.Role, loggedUser.roles[0]) 
        }, "ApplicationCookie"); 

    var ctx = Request.GetOwinContext(); 
    var authManager = ctx.Authentication; 

    authManager.SignIn(identity); 

我嘗試用這個

public class CustomRoleProvider : RoleProvider 
{ 
    public override bool IsUserInRole(string username, string roleName) 
    { 
     using (var usersContext = new TicketSystemEntities()) 
     { 
      var user = usersContext.tblUser.SingleOrDefault(u => u.email == username); 
      if (user == null) 
       return false; 
      return user.role != null && user.role==roleName; 
     } 
    } 
} 

,但我不知道如何配置Web.config文件。當然我也會有錯誤,比如

TicketSystem.Models.CustomRoleProvider「不實現繼承的抽象成員」 System.Web.Security.RoleProvider.GetUsersInRole(串)

我正在尋找其他的例子但我沒有找到任何示例作者使用索賠

回答

0

RoleProvider是一個抽象類,你必須實現所有的抽象方法來編譯你的CustomRoleProvider

Web.config中,您需要添加部分roleManager並添加您的自定義提供程序。事情是這樣的:

<roleManager enabled="true" defaultProvider="CustomRoleProvider"> 
    <providers> 
    <clear/> 
    <add name="CustomRoleProvider" 
     type="TicketSystem.Models.CustomRoleProvider, 
      TicketSystem, Version=1.0.0.0, Culture=neutral" 
     connectionStringName="TicketSystemEntities" 
     enablePasswordRetrieval="false" enablePasswordReset="true"/> 
    </providers> 
</roleManager> 

僅供參考檢查RoleProvider文檔https://msdn.microsoft.com/en-us/library/system.web.security.roleprovider(v=vs.140).aspx和roleManager文檔https://msdn.microsoft.com/en-us/library/vstudio/ms164660%28v=vs.100%29.aspx

相關問題