TL; DR
修改
基本上,我只是想告诉一些功能:好的,我已经检查了这个用户我自己,他没事。现在存储一些关于他的任意数据,并为他创建一个会话,使他有权访问我的应用程序的某些部分。
这类事:
logInUserFrameworkFunction(new UserStruct(int id, string username, RolesEnum[] roles));
并且在后台处理所有内容以使[Authorize(Roles = RolesEnum.Admin | RolesEnum.Manager)]
属性有效。
我可以用自己的会话来做这件事,但我想跳过那部分:D
我正在玩MVC和Entity Framework,现在我想用角色实现简单的用户身份验证。
我的数据库中有User
类/表,如下所示:
public class User {
int ID;
string Email;
string Password;
Role Role;
...
}
和Role
类看起来像这样:
public class Role {
int ID;
RoleType Type; // this is an Enum
}
public Enum RoleType {
visitor, employee, admin
}
现在,检查登录控制器是否存在具有指定用户名和密码的用户很容易,我只是这样做:
[HttpPost]
public ActionResult LogIn(LogIn login) {
// If credentials are valid
if(new UserManager().IsValid(login.Username, login.Password)) {
var user = db.getUserByEmail(login.Username);
...
我可以轻松地在会话中存储用户ID
和Role
,而不是通过在每个相关控制器上调用一些function
来检查凭据,但我想使用一些C#和MVC功能。< / p>
我宁愿用属性来做,但我不确定如何。
这就是我想象的样子:
[Roles(RoleType.visitor, RoleType.employee)]
public ActionResult SomeProtectedAction() {
// only employee and visitor can access this,
// others get redirected to where ever
...
}
答案 0 :(得分:1)
您可以使用以下角色进行授权:
[Authorize(Roles= MyEnum.Admin | MyEnum.Moderator)]
public ActionResult myAction()
{
}
Authorize属性在此处应用于控制器级别,但您可以根据需要仅将其应用于操作方法。
如果您已正确设置了身份验证逻辑(ASP.NET身份),它将返回包含用户角色的身份验证cookie。
现在成功登录后,如果您向控制器方法发出请求,则会在后台解压缩cookie,并且用户属性this.User
将填充此数据,包括该用户的角色。
authorize属性会自动为您进行检查。