2015-01-27 22 views
10

Używam projektu ASP.NET MVC 5 o tożsamości 2.1.0 i VS2013 U4. Chcę dodać roszczenia do użytkownika podczas rejestracji w celu przechowywania w db. Roszczenia te reprezentują niestandardowe właściwości użytkownika.
Po utworzeniu strony internetowej administratora do tworzenia/edycji/usuwania użytkowników nadal używam metody tworzenia z poziomu AccountController, aby utworzyć użytkownika, ale nie chcę się z nim logować. Jak mogę dodać te roszczenia do użytkownika?Jak dodawać oświadczenia podczas rejestracji użytkownika

Odpowiedz

11

Prawdopodobnie już mają Klasa UserManager. Możesz użyć tego do tworzenia użytkowników i dodawania roszczeń.

Jako przykład w kontrolerze:

// 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")); 

Aby to zadziałało trzeba zaimplementować własną UserManager i połączyć go z kontekstu OWIN (w przykładzie jest to ApplicationUserManager który w zasadzie jest class ApplicationUserManager : UserManager<ApplicationUser> { } z tylko dodano niewielką ilość konfiguracji). Odczyt jest dostępny tutaj: https://msdn.microsoft.com/en-us/library/dn613290%28v=vs.108%29.aspx

+0

Udało mi się to. Jeszcze jedno pytanie, czy mogę zmienić roszczenie później w db, gdy zmiany atrybutów użytkownika? A jak mogę uzyskać dostęp do tych roszczeń w aplikacji? – MilanM

+0

Powinieneś być w stanie uzyskać dostęp do tych szczegółów za pomocą właściwości nawigacji w encji ApplicationUser (user.Claims). Oto ciekawa lektura: http://stackoverflow.com/questions/22105583/why-is-asp-net-identity-identitydbcontext-a-black-box – pysco68

+0

O.K. Udało mi się zdobyć roszczenie, ale jak mogę to zmienić? – MilanM

5

można użyć jak

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); 
} 

Po zalogowaniu przekazać wartość tabeli użytkownika w tej funkcji

SignInAsync(result); 

można uzyskać wartość małż jak

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

Dodaje to roszczenia do pliku cookie uwierzytelniania użytkowników i ** nie ** zapisuje ich w bazie danych do załadowania przy następnym logowaniu. Praca z wątkami typu "Thread.CurrentPrincipal" nie jest dobrym pomysłem, ponieważ wątki mogą się zmieniać, szczególnie w scenariuszu asynchronicznym. – ChrFin

+0

@MANISH O.K. Dzięki. Ale jak mogę uzyskać tego użytkownika w mojej metodzie/konta/logowania? – MilanM

+0

@ChrFin jak mogę dodać te do db? – MilanM

0

Możesz w rzeczywistości tworzyć roszczenia w tym samym czasie, gdy tworzysz konto użytkownika.

Po prostu dodaj oświadczenia do obiektu użytkownika, zanim zadzwonisz do CreateAsync na menedżerze użytkownika.

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

Spowoduje to utworzenie użytkownika i powiązanie roszczeń z użytkownikiem jako jednej operacji logicznej z utrwaleniem.

Powiązane problemy