我有一个现有的数据库和一个用户表,我们计划将该数据库用于在ASP.NET MVC中构建的新系统。但是,我不确定的是,我是否能够创建一个不使用内置帐户控制器或常规成员提供程序的登录系统,以便我们仍然可以使用现有的表结构。
所以我的问题是,这是可能的吗?如果是这样,甚至是特别难做到的?
最广为接受和最简单的做事方式是什么?
发布于 2009-09-17 14:44:26
我也有同样的要求。我有自己的用户和角色模式,不想迁移到asp.net成员模式,但我确实想使用ASP.NET MVC过滤器来检查授权和角色。我不得不做相当多的挖掘来找出到底需要做什么,但最终它是相对容易的。我可以省去你的麻烦,告诉你我做了什么。
1)我创建了一个从System.Web.Security.MembershipProvider派生的类。MembershipProvider为各种与身份验证相关的功能提供了大量的抽象方法,比如忘记密码、更改密码、创建新用户等。我所需要的就是能够根据自己的模式进行身份验证。所以我的类主要包含空覆盖。我刚刚重写了ValidateUser:
public override bool ValidateUser(string username, string password)
{
if (string.IsNullOrWhiteSpace(username) ||
string.IsNullOrWhiteSpace(password))
return false;
string hash = EncryptPassword(password);
User user = _repository.GetByUserName(username);
if (user == null) return false;
return user.Password == hash;
}
2)我创建了一个从System.Web.Security.RoleProvider派生的类。再一次,我只是对所有不需要的东西都有了空的实现,比如创建和改变角色。我刚刚重写了两个方法:
public override string[] GetRolesForUser(string username)
{
User user = _repository.GetByUserName(username);
string[] roles = new string[user.Role.Rights.Count + 1];
roles[0] = user.Role.Description;
int idx = 0;
foreach (Right right in user.Role.Rights)
roles[++idx] = right.Description;
return roles;
}
public override bool IsUserInRole(string username, string roleName)
{
User user = _repository.GetByUserName(username);
if(user!=null)
return user.IsInRole(roleName);
else
return false;
}
3)然后我将这两个类插入到我的web.config中:
<membership defaultProvider="FirstlookMemberProvider" userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="FirstlookMemberProvider" type="FirstlookAdmin.DomainEntities.FirstlookMemberProvider, FirstlookAdmin" />
</providers>
</membership>
<roleManager defaultProvider="FirstlookRoleProvider" enabled="true" cacheRolesInCookie="true">
<providers>
<clear/>
<add name="FirstlookRoleProvider" type="FirstlookAdmin.DomainEntities.FirstlookRoleProvider, FirstlookAdmin" />
</providers>
</roleManager>
就这样。默认授权操作筛选器将使用这些类。您仍然需要处理登录页面、登录和注销。只需像平常一样使用标准的forms身份验证类即可。
发布于 2009-09-17 11:08:02
你当然可以。我这样做是为了我的项目,完全忽略了会员服务提供商。
您需要实现自己的ActionFilter。基本上,它将在命中控制器操作之前截获控制。在其中,您可以决定是继续操作还是将用户重定向到登录页面。
对于该属性,您可以定义支持您的身份验证/授权模型所需的任何参数。
public class AuthorizationAttribute : ActionFilterAttribute, IActionFilter
{
public MyRole UserRole { get; set; }
void IActionFilter.OnActionExecuting (ActionExecutedContext filterContext)
{
// Decide whether to grant access to the action or redirect away
}
}
[Authorization (UserRole = MyRole.All)]
public class UserController : Controller
{
[Authorization (UserRole = MyRole.Admin)]
public ActionResult Delete ()
{
}
}
关于评论中表达的关切。是的,启用输出缓存会干扰授权。人们只需要意识到这一点。
问题的解释:ASP.NET MVC Tip #40 - Don’t Cache Pages that Require Authorization
https://stackoverflow.com/questions/1438151
复制相似问题