C#MVC带有角色的简单自定义身份验证

本文关键字:简单 自定义 身份验证 角色 C#MVC | 更新日期: 2023-09-27 17:49:20

TL;博士

EDit

基本上,我只想告诉一些功能:好吧,我已经亲自检查了这个用户,他很好。现在存储一些关于他的任意数据,并为他创建一个会话,允许他访问我的应用程序的某些部分。

这类东西:

logInUserFrameworkFunction(new UserStruct(int id, string username, RolesEnum[] roles));

然后一切都在后台处理,以使[Authorize(Roles = RolesEnum.Admin | RolesEnum.Manager)]属性工作。

我可以自己用会话来做这件事,但我想跳过这一部分:D


我正在学习MVC和实体框架,现在我想用角色实现简单的用户身份验证。

我的数据库中有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);
...

我可以很容易地将用户IDRole存储在会话中,然后通过在每个相关控制器上调用一些function来检查凭据,但我想使用一些C#和MVC功能。


问题是,我宁愿用属性来做,但我不确定如何做。

这就是我想象的样子:

[Roles(RoleType.visitor, RoleType.employee)]
public ActionResult SomeProtectedAction() {
// only employee and visitor can access this,
// others get redirected to where ever
...
}

C#MVC带有角色的简单自定义身份验证

您可以使用以下角色进行授权:

[Authorize(Roles= MyEnum.Admin | MyEnum.Moderator)]
public ActionResult myAction()
{
}

Authorize属性在这里应用于控制器级别,但您只能根据需要将其应用于操作方法。

如果您已正确设置身份验证逻辑(ASP.NET Identity(,该逻辑将返回包括用户角色的身份验证cookie。现在,在成功登录后,如果您向控制器方法发出请求,cookie将在后台解压缩,并且User属性this.User将填充此数据,包括该用户的角色。

authorize属性将自动为您进行检查。