我正在构建一个Asp.net MVC3应用程序(使用Razor),我有一个数据库,其中包含有关用户和角色的信息。
这是我的数据库的简化方案。
用户( IDUser ,登录,密码);
角色( IDRole ,姓名);
UserInRole( IDUser , IDRole ); //多对多
看起来像这样:
我读到了使用AuthorizeAttribute,控制loged用户的页面,以及使用特定角色和我研究使用My DB来控制用户和角色。所以我的问题是:
如果可能,请发布代码示例。
答案 0 :(得分:1)
不确定我是否理解正确,但您想使用[Authorize]
属性来处理自定义用户数据库吗?
如果是这种情况,可以检查一下:
要简单地允许/拒绝用户是否获得授权,库存[Authorize]
属性将正常运行。自定义逻辑进入您的登录操作,您将使用给定的凭据检查数据库并相应地发出cookie。类似的东西:
public ActionResult Login(string username, string password)
{
bool isValid = //check the database with the given username and password
if(isValid)
{
FormsAuthentication.SetAuthCookie(username, false);
return RedirectToAction("...");
}else
{
return View();
}
}
如果您还希望根据角色控制访问权限,我会说有两种直接方式:
实现自定义成员资格和角色提供程序,这是我不喜欢的东西,因为我觉得它们很无用,并且总是最终重做我的资源库中的逻辑
实施自定义AuthorizeAttribute,例如
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//Check based on these 2 properties:
// this.Roles
// this.Users
//against httpContext.User
//return true or false to indicate access or deny
}
}
答案 1 :(得分:0)
感谢佩德罗。根据你的帖子我构建它以使用SESSION:
public class CustomAutorizeAttribute : AuthorizeAttribute
{
public List<string> Roles { get; set; }
public CustomAutorizeAttribute()
{
}
public CustomAutorizeAttribute(params string[] Roles)
{
this.Roles = new List<string>();
this.Roles.AddRange(Roles);
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
User user = (User)httpContext.Session["user"];
if (user != null)
{
if (Roles != null)
{
foreach (var role in user.Roles)
{
if (Roles.Exists(e => e == role)) return true;
}
return false; // User don't have any hole
}
else
{
return true; // The Attribute is used without roles.
}
}
else return false; // Not logged.
}
}
在这里发帖,希望别人。