ASP.NET Core 3.1 +基于Angular 9角色的身份验证

时间:2020-06-18 22:46:01

标签: asp.net angular identity

我用ASP.NET Core 3.1创建了一个Web应用程序,并使用Visual Studio模板创建了一个Web应用程序并启用了身份验证。 enter image description here
然后,我搭建了身份并将其添加到Startup.cs

services.AddDefaultIdentity<ApplicationUser>(options => 
options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

services.AddIdentityServer().AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

services.AddAuthentication().AddIdentityServerJwt();

之后,我创建了3个用户,并为他们分配了不同的角色。当我将属性[Authorize]添加到任何控制器操作中时,它便可以正常工作。但是如何使它基于角色?我已经尝试过[Authorize(Roles = "Administrator")],但是它拒绝了访问。使用不受保护的方法:

 var loggedinUser = await _userManager.FindByNameAsync(userid);
 var roles = await _userManager.GetRolesAsync(loggedinUser);

角色列表上有管理员,所以我不知道要使它起作用是什么。同样在Angular组件中,如何获得当前登录用户的角色?

1 个答案:

答案 0 :(得分:1)

您可以扩展 IdentityServer的默认ProfileService的实现,以包含角色声明,如下所示。

import logging
log = logging.getLogger(__name__)

def my_transform(input):
    log.info("Testing logging")
    return input

别忘了将扩展配置文件服务注册到依赖项容器

public class ExtendedProfileService : ProfileService<ApplicationUser>
{
    public ExtendedProfileService(UserManager<ApplicationUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory) : base(userManager, claimsFactory)
    {

    }

    public override async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        await base.GetProfileDataAsync(context);
        var user = await UserManager.GetUserAsync(context.Subject);
        var roles = await UserManager.GetRolesAsync(user);
        var claims = new List<Claim>();

        foreach (var role in roles)
        {
            claims.Add(new Claim("role", role));
        }
        context.IssuedClaims.AddRange(claims);
    }
}