Asp.Net Core Identity - 没有角色表的简单授权

Posted

技术标签:

【中文标题】Asp.Net Core Identity - 没有角色表的简单授权【英文标题】:Asp.Net Core Identity - simple Authorization without Roles table 【发布时间】:2020-08-05 16:06:31 【问题描述】:

我正在尝试为我的应用程序开发一个简单的用户授权机制,而不使用特定的角色表。

User 实体有一个简单的 Role 枚举属性,我想在某些控制器上适当地装饰 Authorize 属性。

也许我在这里遗漏了一些东西,但是我怎样才能让框架知道用户在登录时或登录后的角色是什么

var result = await _signInManager.PasswordSignInAsync(usr, pwd, false, lockoutOnFailure: false);

然后使用Authorize 属性?

【问题讨论】:

【参考方案1】:

UserManager.AddClaimAsync(TUser, Claim) method 可以帮助向用户添加指定的声明,您可以尝试以下代码 sn-p 来实现您的要求。

var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);

if (result.Succeeded)

    var user = await _userManager.FindByNameAsync(Input.Email);

    var userRole = CustomMethod_FindUserRole(Input.Email);

    await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, userRole));

    //...

    await _signInManager.RefreshSignInAsync(user);


    //...

【讨论】:

谢谢。我认为这应该是公认的答案,但也许您应该指定您必须正确实施 AddClaimAsync _signInManager.PasswordSignInAsync 默认情况下是否添加任何其他声明?【参考方案2】:

您可以使用身份服务器的 ProfileService 向特定用户添加角色声明。需要添加的地方

claims.Add(new Claim("Role","Admin"));

您还需要在您的 starup.cs 中实施政策

services.AddAuthorization(options =>
    
        options.AddPolicy("AdminCheck", policy =>
                          policy.RequireClaim("Role", "Admin"));
    );

在你的动作方法或控制器上你需要把装饰器作为

[Authorize(Policy = "AdminCheck")]
public class VacationController : Controller

    public ActionResult VacationBalance()
    
    

就是这样。

【讨论】:

谢谢。我试图做类似的事情,但我不明白应该在哪里传递声明。添加角色声明后,如何使用声明对象?

以上是关于Asp.Net Core Identity - 没有角色表的简单授权的主要内容,如果未能解决你的问题,请参考以下文章

“Identity.External”的 ASP.NET Core 标识异常

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色

Asp.Net Core 2.1 Identity - UserStore 依赖注入

ASP.NET Core Identity 系列之四

ASP.NET Core Identity - 扩展密码哈希