2016-11-10 22 views
6

Używam asp.net Identity 2.0, aby użytkownicy logowali się na mojej stronie internetowej, gdzie dane uwierzytelniające są przechowywane w bazie danych SQL. Asp.net Tożsamość została zaimplementowana w standardowy sposób, jak można znaleźć w wielu tutorialach online.Jak przedłużyć IdentityUser z niestandardową właściwością?

Klasa w IdentityModelsApplicationUser został rozszerzony o właściwość niestandardową:

public class ApplicationUser : IdentityUser 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType) 
    { 
     CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); 
     return userIdentity; 
    } 
    //My extended property 
    public string Code { get; set; } 
} 

Kiedy zarejestrować nowego użytkownika mijam właściwość Code niestandardowy w RegisterBindingModel ale nie jestem pewien, jak wstawić ten własność niestandardową do tabeli WebUsers.

Zrobiłem jak poniżej, ale tak naprawdę nie wstawia tej właściwości do tabeli razem z nazwą użytkownika i hasłem.

var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code }; 

i cała funkcja:

[AllowAnonymous] 
[Route("Register")] 
public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     var userName = !string.IsNullOrEmpty(model.UserName) ? model.UserName : model.Email; 
     //I set it here but it doesn't get inserted to the table. 
     var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code }; 

     IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 

     return Ok(); 
    } 

Czego mi brakuje? Szukałem podobnych pytań, ale nie mogłem znaleźć odpowiedzi na to pytanie.

+0

Myślę, że twój kod jest OK, czy jesteś pewien, że właściwość 'Code' jest wpisywana w parametrze' model'? – jumuro

+0

Tak, jestem pewien, sprawdziłem to. Ale kiedy sprawdzam tabelę w bazie danych, pojawia się nowy użytkownik, ale pole kodu ma zawsze wartość "null". – user3378165

+0

W jaki sposób definiuje się menedżer użytkownika? Zajrzyj na https://github.com/tjoudeh/AspNetIdentity.WebApi –

Odpowiedz

18

Wykonanie wszystkich czynności związanych z dodaniem pola niestandardowego do użytkownika spowoduje pomyślne zakończenie zadań.

Oto wszystkie kroki, aby dodać niestandardowe pole do użytkownika:

  1. Załóż ASP.NET Web Application
  2. Upewnij się wybrać MVC i uwierzytelniania jest indywidualnego użytkownika Konta:
  3. Przejdź do Modele folder → Otwórz IdentityModels.csApplicationUser klasy i dodać właściwość:

    public string Code { get; set; } 
    
  4. zbudować projekt
  5. Przejdź do TOOLS menu → Nuget Package Manager → kliknij Konsola Package Manager
  6. Wpisz Enable-Migrations i naciśnij Wpisz i poczekaj, aż zadanie zostanie zakończone. pojawi się odpowiedź, która mówi:

    Checking if the context targets an existing database... 
        Code First Migrations enabled for project WebApplication1. 
    
  7. Rodzaj Add-Migration "Code" i naciśnij Enteri czekać aż zadanie dostać zakończone.pojawi się odpowiedź, która mówi:

    Scaffolding migration 'Code'. The Designer Code for this migration 
    file includes a snapshot of your current Code First model. This 
    snapshot is used to calculate the changes to your model when you 
    scaffold the next migration. If you make additional changes to your 
    model that you want to include in this migration, then you can 
    re-scaffold it by running 'Add-Migration Code' again. 
    
  8. Rodzaj Update-Database i naciśnij Enteri czekać aż zadanie dostać zakończone. pojawi się odpowiedź, która mówi:

    Specify the '-Verbose' flag to view the SQL statements being applied 
    to the target database. 
    Applying explicit migrations: [201611132135242_Code]. 
    Applying explicit migration: 201611132135242_Code. 
    Running Seed method. 
    

    na tym etapie, jeśli odświeżyć SQL Server Object Explorer i przejść do bazy danych i patrz tabele, pod dbo.AspNetUsers pod kolumny, zobaczysz pole Code . Jeśli nie wiesz, której bazy danych lub nawet serwer, na którym należy szukać, otwartą Web.Config plik i przyjrzeć się ciąg połączenia, który jest mniej więcej tak:

    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication1-20161114125903.mdf;Initial Catalog=aspnet-WebApplication1-20161114125903;Integrated Security=True" 
    providerName="System.Data.SqlClient" /> 
    

    Można zobaczyć źródło danych (która jest instancją serwera sql) i czymś .mdf, która jest nazwą bazy danych.

  9. idź do modele Folder → Otwórz AccountViewModels.cs Plik → RegisterViewModel klasy i dodać tę właściwość: (W APIv2 z EF6, można dodać poniższy wiersz w modelach Folder Plik → AccountBindingModels → RegisterBindingModel klasa)

    public string Code { get; set; } 
    
  10. idź do Odwiedzin Folder → konto folderu → Otwórz Register.cshtml plik i dodać ten kod w pobliżu innych dziedzinach, na przykład pod hasłem:

    <div class="form-group"> 
        @Html.LabelFor(m => m.Code, new { @class = "col-md-2 control-label" }) 
        <div class="col-md-10"> 
         @Html.TextBoxFor(m => m.Code, new { @class = "form-control" }) 
        </div> 
    </div> 
    
  11. idź do Controllers folderu → Otwórz AccountController.cs Plik → w HTTP POST Rejestracja działania, zmienić linię, która tworzy użytkownikowi do tego:

    var user = new ApplicationUser { UserName = model.Email, Email = model.Email, 
        Code= model.Code }; 
    
  12. projekt prowadzony i przejdź do /Account/Register URL i zarejestrować nowego użytkownika. Po zarejestrowaniu użytkownika, jeśli przejdziesz do bazy danych ponownie i Zobacz dane z tabeli dbo.AspNetUsers, zobaczysz kod został zapisany.

+0

Dziękuję za jasną i szczegółową odpowiedź, brakuje tylko jednego kroku: # Przejdź do folderu Modelki → Otwórz 'AccountViewModels .cs' plik → 'RegisterViewModel' class", na moim 'AccountViewModels.plik cs' nie ma klasy 'RegisterViewModel', czy powinienem ją dodać? Dziękuję Ci! – user3378165

+0

Nie ma za co. Będziesz tego potrzebował. Jeśli nie potrzebujesz, nie będzie "kodu" w przekazanym modelu z widoku. –

+0

Postępuj zgodnie z instrukcjami w czystym roztworze i będzie dla ciebie jasne, co robisz. –