36

Chcę włączyć interfejs API SimpleMembership platformy ASP.NET MVC 4 w celu integracji z moim własnym schematem bazy danych. Mam jasne i proste tabeli w mojej bazy danych o nazwie Users z tych dziedzin:SimpleMembership z niestandardowym schematem bazy danych w ASP.NET MVC 4

  • Id
  • Nazwa
  • Hasło
  • email
  • IsDeleted

już skonfigurowany API SimpleMembership użyć mojej bazy danych:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true); 

I mogę wstawić użytkownika TOO:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
           new 
           { 
             IsDeleted = false, 
             Email = "[email protected]"     
           }); 

Jednak pole Hasło (lub jego hash) jest nie włożono go do tabeli Użytkownicy (oczywiście), wstawiono do innej tabeli o nazwie webpages_Membership, która została utworzona za pomocą wywołania InitializeDatabaseConnection i zawiera wiele niepotrzebnych informacji, których nie potrzebuję.

Mam również inne automatycznie tworzone tabele o nazwach webpages_OAuthMembership, webpages_Roles i webpages_UsersInRoles, których nie potrzebuję.

Ja już próbował ustawić generację tabeli false:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false); 

Ale w tym przypadku wywołanie CreateUserAndAccount rzuci wyjątek, ponieważ nie znajdzie tabeli webpages_Membership.

Wygląda na to, że te tabele są potrzebne, gdy chcę korzystać z interfejsu API SimpleMembership.

Moje pytanie brzmi: co powinienem zrobić w takim scenariuszu, kiedy chcę tylko prosty stół Users i nic więcej?

Czy muszę napisać osobiście całą obsługę członkostwa i logikę uwierzytelniania (generowanie kodu hasłowego itp.)?

Odpowiedz

11

Zadałem to samo pytanie zespołowi ds. Produktu.

Celem projektu członkostwa SIMPLE było proste poznanie prostoty.

Tak naprawdę nie ma możliwości dostosowania w odniesieniu do tabel. Zalecanym sposobem obejścia tego problemu jest nadal używanie członkostwa ASP.NET (SqlMembershipProvider).

+0

OK, dziękuję! Może napiszę własną logikę uwierzytelniania. – Zsolt

+33

NIE! Proszę, nie rób tego! :-) – Max

+0

Korzystanie z SqlMembership jest takie proste! Po prostu wyszukaj samouczek dotyczący członkostwa ASP.NET. Jest bardzo elastyczny! – Max

2

Możesz używać OAUth z Universal Providers ASP.NET. operatorzy uniwersalni to nowa wersja dostawców sqlmembership.są one oparte na EF CodeFirst a także generować więcej czystszej schematu wygląd bazie w moim następnym poście więcej szczegółów http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth-openid-with-your-existing-asp-net-application-using-universal-providers.aspx

+0

Universal Providers nie są kompatybilne z SimpleMembership, a to nie dotyczy pytania OP. –

3

1 - Musisz włączyć migracje się, korzystnie z EntityFramework 5. Korzystanie Enable-Migrations w pakiecie Nuget menedżer.

2 - Move Your

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 

do sposobu siewu w swojej klasie YourMvcApp/Migracje/Configuration.cs

protected override void Seed(UsersContext context) 
    { 
     WebSecurity.InitializeDatabaseConnection(
      "DefaultConnection", 
      "UserProfile", 
      "UserId", 
      "UserName", autoCreateTables: true); 

     if (!Roles.RoleExists("Administrator")) 
      Roles.CreateRole("Administrator"); 

     if (!WebSecurity.UserExists("lelong37")) 
      WebSecurity.CreateUserAndAccount(
       "lelong37", 
       "password", 
       new {Mobile = "+19725000000", IsSmsVerified = false}); 

     if (!Roles.GetRolesForUser("lelong37").Contains("Administrator")) 
      Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"}); 
    } 

Teraz EF5 będzie odpowiedzialny za tworzenie tabeli USERPROFILE, po zrobieniu więc nazwiesz WebSecurity.InitializeDatabaseConnection, aby rejestrować tylko SimpleMembershipProvider z już utworzoną tabelą UserProfile, również informując SimpleMembershipProvider, która kolumna jest UserId i UserName. Pokazuję również przykład, w jaki sposób można dodawać użytkowników, role i powiązanie tych dwóch w swojej metodzie seed z niestandardowymi właściwościami/polami UserProfile, np. telefon komórkowy użytkownika (numer).

3 - Teraz po uruchomieniu update-bazy danych z pakietu konsoli Menedżer EF5 będzie przepis tabela ze wszystkimi swoimi właściwościami niestandardowymi

uzyskać dodatkowe referencje zapoznaj się z tym artykułem z kodu źródłowego: http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

+2

Myślę, że ten wpis na blogu dotyczy innego tematu: wysiew danych przy pomocy Migracji kodu EF. Wiem, że mogę dodać dowolną właściwość do mojej tabeli użytkowników (np. Ciąg Mobilny), nie chodziło mi tylko o przepisanie/dostosowanie całego schematu automatycznie generowanych tabel SimpleMembership. – Zsolt

11

Personalizacja jest możliwa.

można uzyskać kod źródłowy SimpleMembershipProvider od the aspnetwebstack project on CodePlex, ponieważ jest to miejsce gdzie występuje mapowanie pomiędzy DB schematu i środowiska wykonawczego można zmodyfikować ten kod do modyfikacji/wymienić schematu, oświadczenia, itp do własnych potrzeb (bez dużo ból głowy, IMO).

2

ta może nie działać dla przypadków użycia, ale oczywiście można bardzo łatwo dodać atrybuty użytkownika do Simplemembership UserProfile tabeli zamiast tworzyć kolejny tabeli użytkownika

polecam przy użyciu istniejącą tabelę członkostwa, aby zachować zakodowane hasło i po prostu zignorować pola, których nie potrzebujesz. W ten sposób zachowuje zgodność z SimpleMembership bez większego zamieszania.

Usługa SQLMembership jest bardzo prosta po wyjęciu z pudełka. Zrobiłem rozbudowane spersonalizowane rozszerzenia do SQLMembership w kilku projektach, co nie było trudne - ale patrząc wstecz, żałuję, że nie miałem. Jest to rodzaj kłopotów z konserwacją,

2

Można utworzyć własnego dostawcę członkostwa, rozszerzając członkostwo MembershipProvider. Aby uzyskać więcej informacji, patrz Custom MembershipProvider in .NET 4.0. Korzystając z tego podejścia, wystarczy wdrożyć odpowiednie metody. Powinno to pomóc w utrzymaniu prostoty i nie wymagać dodawania tabel, których nie potrzebujesz.

podstawowe kroki (wzięte z powiązany SO odpowiedzieć) są:

  1. Utwórz nowy plik klasy (jeśli nie używasz wielowarstwowego systemu, w folderze Models Twojego projektu) nazwijmy to MyMembershipProvider.cs
  2. Dziedzicz tę klasę z System.Web.Security.MembershipProvider
  3. Automagicznie utworzyć potrzebne metody (okres + przestrzeń w klasie dziedziczyć)
0

Można użyć zarówno tabela niestandardowe Użytkownicy wraz z tabelami SimpleMembership. Ta metoda sprawdzała się doskonale w przeszłości.

Na przykład w metodzie rejestru w AccountController można zarejestrować nowego użytkownika, dodając użytkownika do własnej tabeli Users. Następnie dodaj tego użytkownika do tabeli UserProfile SimpleMembership, używając identyfikatora użytkownika dodanego do tabeli Users.

using (var context = new MyDatabaseEntities()) 
{ 
    User newUser = new User(){ 
     Name = model.Name, 
     Email = model.Email, 
     IsDeleted = false 
    } 

    // Add the user to your custom Users table 
    context.Users.Add(newUser); 
    context.SaveChanges(); 

    // Add this user to the SimpleMembership table using the same Id as the custom Users table 
    WebSecurity.CreateUserAndAccount(newUser.Id.ToString(), model.Password); 

    // Log the user in 
    WebSecurity.Login(newUser.Id.ToString(), model.Password); 
} 
Powiązane problemy