Asp.net mvc 首先使用SimpleMembershipProvider编写实体框架代码
我在一个解决方案中有两个项目: 域类库、我的实体和DBContext都在这里 foo.WebUI ASP.NET MVC 4.5,空模板 在foo.Domain中,我创建实体,并使用实体框架将它们转换为实际的数据库Asp.net mvc 首先使用SimpleMembershipProvider编写实体框架代码,asp.net-mvc,entity-framework,simplemembership,Asp.net Mvc,Entity Framework,Simplemembership,我在一个解决方案中有两个项目: 域类库、我的实体和DBContext都在这里 foo.WebUI ASP.NET MVC 4.5,空模板 在foo.Domain中,我创建实体,并使用实体框架将它们转换为实际的数据库 我一直在网上搜索如何首先使用实体框架代码和ASP.NET MVC 4中内置的simplemembershipprovider创建带有注册、登录功能等的自定义成员资格功能,但是大多数在线演示使用的foo.WebUI中的实体框架和迁移都在foo.WebUI中,而不使用foo.Domain
我一直在网上搜索如何首先使用实体框架代码和ASP.NET MVC 4中内置的simplemembershipprovider创建带有注册、登录功能等的自定义成员资格功能,但是大多数在线演示使用的foo.WebUI中的实体框架和迁移都在foo.WebUI中,而不使用foo.Domain类库,如果这样做,我将在foo.Domain其他实体和foo.WebUIuser+角色实体中完成两个独立的迁移。我对我应该做什么感到非常困惑,希望我说的有意义。假设您在foo.Domain中有以下表格,这些表格将管理安全事项: 至少具有Id、用户名、密码和IsActive的用户 角色Id,角色的名称 具有RoleId、UserId的用户角色 然后您可以执行以下操作:
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;
}
}
}
1-添加一个名为CustomMembership的类,该类包含以下内容
2-将referenece添加到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" />
希望这能帮助您您有什么理由想使用SimpleMembership而不是更新的推荐Identity v2?@DavidG这也是我看到的,它是ASP.NET MVC 5附带的,对吗?它在ASP.NET MVC 4.5项目中也有实体,迁移都在这个项目中,我想要的是将它们移动到域库中,因为我将有其他实体。是的,它通常与MVC5一起使用,但可以与MVC4一起使用。我有几个使用Identity v2的项目,这些项目的所有实体、迁移等都在一个不同的项目中,正如您所描述的。请为我提供一些关于如何实现这一点的解释。这是一个可能过于宽泛的答案,因此,有一些关于如何在线实现这一点的教程。感谢您花时间提出解决方案,这不是我想要的,但谢谢你