首页 > 解决方案 > ASP.NET Core 3.1 + Angular 9 基于角色的身份验证

问题描述

我已经使用 ASP.NET Core 3.1 创建了一个 Web 应用程序,并使用 Visual Studio 模板创建了 Angular 并启用了身份验证。 然后我搭建了 Identity 并将其添加到:在此处输入图像描述
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 组件中,如何获取当前登录用户的角色?

标签: asp.netangularidentity

解决方案


您可以扩展IdentityServer 的默认 ProfileService 的实现,以包括如下方式的角色声明。

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);
    }
}

并且不要忘记将您的扩展配置文件服务注册到依赖容器

services.AddTransient<IProfileService, ExtendedProfileService>();

推荐阅读