2015-01-27 3 views
10

Я использую проект ASP.NET MVC 5 с идентификаторами 2.1.0 и VS2013 U4. Я хочу добавить претензии к пользователю во время регистрации, чтобы быть сохраненным в db. Эти требования представляют пользовательские свойства пользователя.
Поскольку я создал веб-страницу для администратора, чтобы создавать/редактировать/удалять пользователей, я все еще использую метод create от AccountController для создания пользователя, но я не хочу входить в этот пользователь. Как я могу добавить эти претензии к пользователю?Как добавить претензии во время регистрации пользователя

ответ

11

Вы, наверное, уже есть UserManager класс. Вы можете использовать его для создания пользователей и для добавления претензий.

В качестве примера в контроллере:

// gather some context stuff 
var context = this.Request.GetContext(); 

// gather the user manager 
var usermanager = context.Get<ApplicationUserManager>(); 

// add a country claim (given you have the userId) 
usermanager.AddClaim("userid", new Claim(ClaimTypes.Country, "Germany")); 

Для того, чтобы это работало вам нужно реализовать свой собственный UserManager и связать его с контекстом Owin (в данном примере это ApplicationUserManager, которая в основном является class ApplicationUserManager : UserManager<ApplicationUser> { } только с добавлено небольшое количество конфигурации). Немного прочитайте здесь: https://msdn.microsoft.com/en-us/library/dn613290%28v=vs.108%29.aspx

+0

Я преуспел в этом. Еще один вопрос: могу ли я изменить заявку позже в db, когда изменяется атрибут пользователя? И как я могу получить доступ к этим претензиям в приложении? – MilanM

+0

Вы должны иметь возможность получить эти данные, используя свойства навигации на объекте ApplicationUser (user.Claims). Здесь есть некоторые интересные сведения об этом: http://stackoverflow.com/questions/22105583/why-is-asp-net-identity-identitydbcontext-a-black-box – pysco68

+0

O.K. Я преуспел, чтобы получить претензии, но как я могу его изменить? – MilanM

5

вы можете использовать Как

private void SignInAsync(User User) 
{ 
    var claims = new List<Claim>(); 

    claims.Add(new Claim(ClaimTypes.Name, User.Employee.Name)); 
    claims.Add(new Claim(ClaimTypes.Email, User.Employee.EmailId)); 
    claims.Add(new Claim(ClaimTypes.Role, User.RoleId.ToString())); 
    var id = new ClaimsIdentity(claims, 
           DefaultAuthenticationTypes.ApplicationCookie); 
    var claimsPrincipal = new ClaimsPrincipal(id); 
    // Set current principal 
    Thread.CurrentPrincipal = claimsPrincipal; 
    var ctx = Request.GetOwinContext(); 
    var authenticationManager = ctx.Authentication; 

    authenticationManager.SignIn(id); 
} 

после регистрации передать значение таблицы пользователя в этой функции

SignInAsync(result); 

вы можете получить значение моллюск как

var identity = (ClaimsPrincipal)Thread.CurrentPrincipal; 
// Get the claims values 
     string UserRoleValue = identity.Claims.Where(c => c.Type == ClaimTypes.Role) 
          .Select(c => c.Value).SingleOrDefault(); 
+0

Это добавляет претензии к файлу cookie аутентификации пользователей и не ** сохраняет их в БД для загрузки при следующем входе в систему. Также работа с такими потоками, как «Thread.CurrentPrincipal», не очень хорошая идея, поскольку потоки могут переключаться, особенно в сценарии async. – ChrFin

+0

@MANISH O.K. Благодарю. Но как я могу получить этого пользователя в моем/Account/Login методе? – MilanM

+0

@ChrFin, как я могу добавить их в db? – MilanM

0

Фактически вы можете создавать претензии одновременно с созданием учетной записи пользователя.

Просто добавьте претензии к объекту пользователя, прежде чем вызывать CreateAsync в диспетчере пользователей.

var identityUser = new IdentityUser 
{ 
    UserName = username, 
    Email = email, 
    // etc... 
    Claims = { new IdentityUserClaim { ClaimType = "SomeClaimType", ClaimValue = "SomeClaimValue"} } 
}; 
var identityResult = await _userManager.CreateAsync(identityUser, password); 

Это создаст пользователя и свяжет претензии с пользователем как одну логическую операцию с сохранением.

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