asp.net - 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 组件中,如何获取当前登录用户的角色?
解决方案
您可以扩展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>();
推荐阅读
- javascript - 使用 Node.js 的导入模块时出错
- java - 如何从 CommittingOutputstream 中读取数据?
- react-native - secureTextEntry 正在改变字体系列 React Native
- python - 在 Html.Div 中以 html 格式写入 pandas 数据
- python - Python Selenium div 隐藏在检查中,看不到按钮在实际页面上显示 div
- delphi - TButton 和 TBitBtn,继承和 ImageList 支持
- javascript - 根据屏幕大小显示不同的按钮
- r - In R, converted factor variables to numeric don't show as such and recoding Likert scale doesn't work. Why is this?
- javascript - 为什么 GSAP 输入不透明动画无法正常工作?
- c++ - C++ Visual Studio Community 2019 SFML 链接快捷方式