2015-05-12 2 views
0

У меня есть таблица User в моей базе данных, где я сохраняю роль пользователя (главный администратор, администратор, разработчик). Я хочу авторизовать некоторые контроллеры , поэтому доступ к нему может иметь только главный администратор.Поставщик пользовательских ролей с претензиями

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

Смежные вопросы