我在MVC 4中创建web应用程序,这需要自定义登录,身份验证和基于角色的系统。我的目的是使用SimpleMembership和SimpleRole,但在我的应用程序中很难开始并掌握它的基本含义。
我已经有了数据库,比如DB1.mdf,并且已经用userId和UserName创建了用户表。我认为我需要用现有的数据库初始化简单的成员关系?如果系统找不到数据库,我不希望它自己创建数据库,就像它在visual studio 2012创建的默认互联网模板中所做的那样。
非常感谢在进阶...
发布于 2012-12-15 02:25:42
您需要使用WebSecurity.InitializeDatabaseFile告诉MVC.NET您已经有一个数据库和一个Users表。然后,确保提供程序在初始化时使用它。因此,创建一个ActionFilterAttribute来确保简单成员资格提供程序已初始化,例如:
[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()
{
try
{
if (!WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "UserId", "UserName", 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);
}
}
}
}然后,您将需要注册过滤器:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new InitializeSimpleMembershipAttribute());
}
}编辑:多亏了建设性的批评,我删除了用属性修饰控制器的代码,因为全局添加它已经解决了这个问题。如果您决定不在全局范围内使用它,您将需要使用它来装饰其他控制器,因为正如在this question上所解释的,您会注意到,用户可能会使用cookies进行身份验证并被重定向到其他控制器,而无需首先通过您的AccountController传递。
此外,Jon Galloway还向in this post展示了如何通过使用以下命令指向现有数据库:
WebSecurity.InitializeDatabaseFile("SecurityDemo.sdf", "Users", "UserID", "Username", true);发布于 2012-12-15 02:39:30
SimpleMembership是not developed for extensive customization or integrating to existing databases。要使用现有的数据库,您需要创建自己的成员提供程序,就像在ASP.NET中一样。您可以在creating your own membership provider here上找到方向。
https://stackoverflow.com/questions/13880353
复制相似问题