asp.net-mvc-4 - 如何在 MVC 4 中创建自定义 WebSecurity.Login 和 WebSecurity.CreateUserAndAccount 方法?

标签 asp.net-mvc-4 asp.net-membership custom-membershipprovider

当我们选择New Project --> MVC 4 --> Internet Application ,它会自动为我们生成AccountController。在这个 Controller 中,我只关心 2 个 Action ,LoginRegister .

在 MVC 3 中,它使用 Membership 的静态方法,ValidateUserLogin行动和CreateUserRegister .所以,如果我想把它与我自己的数据库集成,我只需要创建 CustomMembershipProvider通过扩展 MembershipProvider并覆盖这两个方法。

但在 MVC 4 中,它使用 WebSecurity.LoginWebSecurity.CreateUserAndAccount .我的问题是:

  • 如何让它像在 MVC 3 中那样使用我自己的数据库?
  • 有什么不同?为什么不继续使用静态成员资格方法?为什么一定要改成WebSecurity ?

  • 非常感谢您的帮助。

    最佳答案

    您将需要实现自己的 Membership 和 Role 提供程序。

    自定义提供程序:

    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);
            }
        }
    }
    

    您只需要覆盖要“拦截”的方法(即 ValidateUser)。您还需要在 web.config 文件中注册提供程序:
    <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>
    

    您还应该有一个名为“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);
                    }
                }
            }
        }
    }
    

    我希望这会有所帮助...

    关于asp.net-mvc-4 - 如何在 MVC 4 中创建自定义 WebSecurity.Login 和 WebSecurity.CreateUserAndAccount 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16605519/

    相关文章:

    c# - ASP.NET 自定义 MembershipProvider

    c# - ASP.NET MVC 4 Beta 编辑器模板对 CSRF 安全吗?

    javascript - 在 javascript 中分配 ViewBag 属性

    asp.net - Entity Framework 连接字符串对于角色提供者无效?

    c# - 登录错误 : codes specific to reason why there was an error

    .net - 如何微调成员(member)提供商?

    javascript - 升级到MVC 4,区域现在找不到脚本

    ajax - MVC 4 : Return partial view inside of bootstrap modal upon failed validation

    c# - 如何限制多次登录同一用户 C# 和 Active Directory 成员身份

    c# - web.config 中的成员资格自定义提供程序调用失败