我用ASP.NET Core 3.1创建了一个Web应用程序,并使用Visual Studio模板创建了一个Web应用程序并启用了身份验证。
然后,我搭建了身份并将其添加到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组件中,如何获得当前登录用户的角色?
答案 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);
}
}