12

Wenn wir New Project --> MVC 4 --> Internet Application wählen, wird automatisch AccountController für uns generiert. In diesem Controller interessieren mich nur 2 Aktionen, Login und Register.Wie werden benutzerdefinierte WebSecurity.Login und WebSecurity.CreateUserAndAccount-Methoden in MVC 4 erstellt?

In MVC 3, verwendet es Membership statische Methoden, ValidateUser in Login Aktion und CreateUser in Register. Also, wenn ich es mit meiner eigenen Datenbank integrieren möchte, muss ich einfach CustomMembershipProvider erstellen, indem ich MembershipProvider verlängere und diese zwei Methoden überschreibe.

Aber in MVC 4 verwendet es WebSecurity.Login und. Meine Fragen sind:

  1. Wie kann ich es machen meine eigene Datenbank wie ich in MVC 3?
  2. Was ist das anders? Warum verwendet es nicht weiterhin statische Mitgliedschaftsmethoden? Warum muss es in WebSecurity geändert werden?

Vielen Dank für Ihre Hilfe.

Antwort

17

Sie müssen Ihre eigenen Mitgliedschafts- und Rollenanbieter implementieren.

Individuelle Provider:

namespace MyApp.Helpers 
{ 
    public class CustomProviderProvider : SimpleMembershipProvider 
    { 
     public override MembershipUser GetUser(string username, bool userIsOnline) 
     { 
      return base.GetUser(username, userIsOnline); 
     } 

     public override bool ValidateUser(string username, string password) 
     { 
      return true; // base.ValidateUser(username, password); 
     } 
    } 
} 

Sie werden nur die Methoden außer Kraft setzen müssen Sie auf "Intercept" (dh ValidateUser) wollen. Sie werden auch die Anbieter in der Datei web.config registrieren müssen:

<system.web> 
    <membership defaultProvider="CustomMembershipProvider"> 
     <providers> 
     <clear/> 
     <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" /> 
     <add name="CustomMembershipProvider" type="MyApp.Helpers.CustomMembershipProvider, MyApp" /> 
     </providers> 
    </membership> 
</system.web> 

Sie sollten auch ein Filter "InitializeSimpleMembershipAttribute"

namespace CustomPortal.Filters 
{ 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute 
    { 
     private static SimpleMembershipInitializer _initializer; 
     private static object _initializerLock = new object(); 
     private static bool _isInitialized; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      // Ensure ASP.NET Simple Membership is initialized only once per app start 
      LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
     } 

     private class SimpleMembershipInitializer 
     { 
      public SimpleMembershipInitializer() 
      { 
       Database.SetInitializer<CustomPortalContext>(null); 

       try 
       { 
        using (var context = new CustomPortalContext()) 
        { 
         if (!context.Database.Exists()) 
         { 
          // Create the SimpleMembership database without Entity Framework migration schema 
          ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); 
         } 
        } 
//Here is where you give it your connection string name 
        WebSecurity.InitializeDatabaseConnection("CustomPortal", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 
       } 
       catch (Exception ex) 
       { 
        throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); 
       } 
      } 
     } 
    } 
} 

genannt habe ich hoffe, das hilft ...

+0

Vielen Dank für Ihre Antwort. Warum brauche ich diesen Filter? Nur zum Erstellen der Datenbank? Wenn ich Entity Framework verwende, brauche ich diesen Filter nicht? – AnhTriet

+0

Wie wäre es mit benutzerdefinierten SimpleRoleProvider erstellen und konfigurieren? – AnhTriet

+0

Der Filter erstellt nicht nur die Datenbank, sondern initialisiert auch die WebSecurity-Klasse. Auf diese Weise können Sie WebSecurity mitteilen, welche Datenbank und welche Felder verwendet werden sollen. Der Filter ist nur ein guter Ort für die Initialisierung, da die Attribute wiederverwendbar sind.Sie können die Initialisierung in der gloabal.asax Seite tun, bin ich sicher. Dies ist jedoch nicht so granular, wenn Sie mehr Kontrolle benötigen, und die Initialisierung an anderen Orten kann zu doppeltem Code führen, der sich in einen Wartungs-Albtraum verwandeln kann. Auch wenn Sie Entity Framework verwenden, würden Sie immer noch etwas zu diesem Zweck verwenden. – PantsOffNow

2

ASP.NET MVC 4 verwendet einen neuen Mitgliedschaftsanbieter namens SimpleMembershipProvider. WebMatrix ist eine Fassade über SimpleMembershipProvider. Es besteht keine Notwendigkeit mehr, die Konfigurationsdatei mit ASP.NET MVC 4 zu modifizieren. Weitere Informationen finden Sie hier: http://aaron-hoffman.blogspot.com/2013/02/aspnet-mvc-4-membership-users-passwords.html

1.Wie kann ich meine eigene Datenbank wie in MVC 3 verwenden?

A: Keine Notwendigkeit, SimpleMembershipProvider zu überschreiben, wenn Sie Ihre eigenen rollen möchten. Entfernen Sie den Verweis auf InitializeSimpleMembershipAttribute in der Klasse AccountController, und ändern Sie die Methoden in der Klasse AccountController.

2. Was ist das anders? Warum verwendet es nicht weiterhin statische Mitgliedschaftsmethoden? Warum muss es in WebSecurity geändert werden?

A: ASP.NET MVC 4 Verwendet nun einen neuen Mitgliedschaftsanbieter: SimpleMembershipProvider.

Verwandte Themen