实体框架代码首先使用SimpleMembershipProvider

时间:2014-10-21 11:27:51

标签: asp.net-mvc entity-framework simplemembership

我在一个解决方案中有两个项目:

  1. foo.Domain(类库,我的实体和DBContext在这里)
  2. foo.WebUI(ASP.NET MVC 4.5,空模板)
  3. 在foo.Domain里面我创建我的实体并使用Entity Framework将它们转换为实际的数据库。

    我一直在网上搜索如何使用实体框架代码创建一个自定义成员资格功能,包括注册,登录功能等,并在ASP.NET MVC 4中使用simplemembershipprovider构建,但大多数在线演示使用实体foo中的框架.WebUI和迁移都在foo.WebUI里面而不使用foo.Domain类库,如果我这样做,我最终会在foo.Domain(其他实体)和foo中进行两次单独的迁移。 WebUI(用户+角色实体)。我对自己应该做的事情感到非常困惑,希望我所说的有道理。

1 个答案:

答案 0 :(得分:0)

假设您有foo.Domain以下表格将管理安全事项:

  1. 用户(至少拥有Id,UserName,Password和IsActive)
  2. 角色(身份证,角色名称)
  3. UserRoles(具有RoleId,UserId)
  4. 然后您可以执行以下操作:

    1-添加一个类调用它(CustomMembership)包含以下

    2-添加引用WebMatrix.WebData以使用简单成员资格提供程序

     public class CustomMembership : SimpleMembershipProvider
        {
    
            public override bool ValidateUser(string username, string password)
            {
                if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
                    return false;
                using (var context = new Entities()) // Entities is your Context
                {
                    string encryptedPassword = Encrypt(password); // Encryt is used for comparing the entered password with the encrypted password stored in db
                    var item = context.Users.Where(t => t.UserName.ToLower() == username.ToLower()
                        && t.Password == encryptedPassword
                        && t.IsActive).FirstOrDefault();
                    return item != null;
    
                }
            }
        }
    

    3-添加名为CustomRoleManager的类,包含以下内容:

    public class CustomRoleManager : SimpleRoleProvider
        {
            public override bool IsUserInRole(string username, string roleName)
            {
                using (var context = new Entities())
                {
                    var result = context.UserRoles.FirstOrDefault(t => t.Role.Name == roleName
                        && t.User.UserName.ToLower() == username.ToLower()
                        && t.User.IsActive);
                    return result != null;
                }
            }
    
            public override string[] GetAllRoles()
            {
                using (var context = new Entities())
                {
                    var result = context.Roles.Select(t => t.Name).ToArray();
                    return result;
                }
            }
    
            public override string[] GetRolesForUser(string username)
            {
                using (var context = new Entities())
                {
                    var result = (from ur in context.UserRoles
                                  join u in context.Users on ur.UserId equals u.Id
                                  join r in context.Roles on ur.RoleId equals r.Id
                                  where u.UserName.ToLower() == username.ToLower()
                                  && u.IsActive
                                  select r.Name).ToArray();
                    return result;
                }
            }
        }
    

    4-在Web.Config文件中添加以下内容,注意你应该添加类的完整路径,这里我把foo.WebUI

    此步骤是告诉您的应用程序使用自定义成员资格和自定义角色管理器

    <roleManager enabled="true" defaultProvider="CustomRoleManager" cacheRolesInCookie="true">
          <providers>
            <clear />
            <add name="CustomRoleManager" type="foo.WebUI.CustomRoleManager" />
          </providers>
        </roleManager>
        <membership defaultProvider="CustomMembership" userIsOnlineTimeWindow="10">
          <providers>
            <clear />
            <add name="CustomMembership" type="foo.WebUI.CustomMembership" connectionStringName="ConnectionString" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" />
          </providers>
        </membership>
    

    5-您可能需要在web.config文件的应用程序设置中添加以下键以避免错误

    <add key="enableSimpleMembership" value="false" />
    <add key="autoFormsAuthentication" value="false" />
    

    希望这会对你有所帮助