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 ...
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
Wie wäre es mit benutzerdefinierten SimpleRoleProvider erstellen und konfigurieren? – AnhTriet
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