1

Мы пытаемся реализовать проект веб-API с идентификаторами OWIN и .Net для аутентификации. У нас есть пользовательские таблицы базы данных для пользователей и ролей, поэтому нам нужно принять первый подход к базе данных для EF.База данных идентификаторов ASP.NET Первый пользовательский пользователь и его роль

мне удалось получить Идентичность работать с нашими таблицами пользовательских учетных записей (благодаря другим StackOverflow нитей), но я застрял на получение роли работать ...

В общем, что я сделал до сих пор реализован пользовательский IUserStore с помощью следующей функции

public class IdentityUserStore<TUser> : 
    IUserStore<TUser>, where TUser : IdentityUser 
{ 

    .... 

    public Task<TUser> FindByNameAsync(string userName) 
    { 
     //throw new NotImplementedException(); 
     IdentityUser user = null; 

     Account result = _accountRepo.GetByEmail(userName); 

     if (result != null) 
     { 
      user = new IdentityUser() 
      { 
       Id = result.Code, 
       UserName = result.Email, 
       SecurityStamp = result.SecurityStamp, 
       PasswordHash = result.PasswordHash, 
      }; 
     } 

     return Task.FromResult<TUser>(user as TUser); 
    } 

    .... 
} 

** Обратите внимание на сущности счетов не унаследовала IUser поэтому мне пришлось вручную сопоставить минимальные данные, необходимые для IdentityUser.

И затем переопределить функцию GrantResourceOwnerCredentials следующим

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     UserManager<IdentityUser> _userManager = new UserManager<IdentityUser>(new IdentityUserStore<IdentityUser>()); 
     IdentityUser user = await _userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim("sub", context.UserName)); 
     identity.AddClaim(new Claim("role", "user")); 

     context.Validated(identity); 

} 

С выше [Авторизоваться] атрибут работы, но мы не можем получить [Авторизовать (Roles = «XXX»)], так как информация о роли не доступна.

Может ли кто-нибудь помочь мне указать направление вправо на получение пользовательских ролей из пользовательских таблиц базы данных, чтобы он работал с картой .Net Identity?

Спасибо!

ответ

1

Проблема с приведенным выше кодом заключается в том, что вы добавляете роль с неизвестным (по крайней мере, для системы) типом претензии. Для ролей предопределенный тип претензии - http://schemas.microsoft.com/ws/2008/06/identity/claims/role или System.Security.Claims.ClaimTypes.Role. Поэтому, пожалуйста, измените свой код на

identity.AddClaim(new Claim("sub", context.UserName)); 
identity.AddClaim(new Claim(ClaimTypes.Role, "user")); 
+0

благодарит за помощь! – ttts862