使用 Web API 的 MVC 用户身份验证

use*_*512 0 asp.net asp.net-mvc asp.net-web-api

我已经构建了一个用于用户登录的WebAPI,如果用户提供了正确的用户名和密码,WebAPI 可以生成访问令牌。我的问题是如何将用户角色信息也传递给 MVC 应用程序。

例如,

我在下面有一个 MVC 应用程序控制器,如何从 Web API 传递角色“管理员、用户编辑器”?我知道我可以使用另一个 WebAPI 调用来检查用户角色,但这不是一个好主意。

[Authorized("Admin,UserEditor")]
ActionResult EditUser(int? Id)
{
........
} 
Run Code Online (Sandbox Code Playgroud)

anı*_*rım 5

您可以从声明中读取角色信息。

Step-1 创建角色-s

我创造了它的种子,但你的选择可能会有所不同。

public static class MyDbInitializer
    {
        public static void Seed(this ModelBuilder builder)
        {
            Guid adminRoleId = Guid.Parse("90a5d1bb-2cf0-4014-9f1a-2d9f644a2e22");

            builder.Entity<IdentityRole<Guid>>().HasData(
                new IdentityRole<Guid>
                {
                    Id = adminRoleId,
                    Name = RoleIdentifier.admin,
                    NormalizedName = RoleIdentifier.admin.ToUpper(CultureInfo.GetCultureInfo("en-GB"))
                });

        }
    }
Run Code Online (Sandbox Code Playgroud)

第 2 步索赔

  public static class RoleIdentifier
    {
        public const string admin = "admin";
        public const string user = "user";
    }

public static class JwtClaimIdentifier
    {
        public const string UserId = "user_id";
        public const string UserName = "user_name";
        public const string Role = "role";
    }
Run Code Online (Sandbox Code Playgroud)

在生成令牌的地方,将角色名称添加到声明信息中。

...
... string role = await _userService.GetRole(userId);
... identity.FindFirst(JwtClaimIdentifier.Role)
Run Code Online (Sandbox Code Playgroud)

Step-3 添加授权属性。到控制器。

 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = RoleIdentifier.admin)]
    public class FooController
    {
    }
Run Code Online (Sandbox Code Playgroud)

当登录用户想要访问此操作时,此角色的拥有将匹配并访问声明。