【发布时间】:2020-12-30 13:35:48
【问题描述】:
我正在使用 ASP.Net 核心 3.1。 在我的 IdentityServer 中,我添加了这样的用户和角色
public static void EnsureSeedData(IServiceProvider serviceProvider)
{
var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var UserManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
IdentityResult roleResult;
//Adding Admin Role
var roleCheck = RoleManager.RoleExistsAsync("Admin").Result;
if (!roleCheck)
{
IdentityRole adminRole = new IdentityRole("Admin");
//create the roles and seed them to the database
roleResult = RoleManager.CreateAsync(adminRole).Result;
RoleManager.AddClaimAsync(adminRole, new Claim("TestClaim1", bool.TrueString)).Wait();
RoleManager.AddClaimAsync(adminRole, new Claim("TestClaim2", bool.TrueString)).Wait();
RoleManager.AddClaimAsync(adminRole, new Claim("TestClaim3", bool.FalseString)).Wait();
}
var alice = UserManager.FindByNameAsync("alice").Result;
if (alice == null)
{
alice = new IdentityUser
{
UserName = "alice",
Email = "AliceSmith@email.com",
EmailConfirmed = true,
};
var result = UserManager.CreateAsync(alice, "Pass123$").Result;
if (!result.Succeeded)
{
throw new Exception(result.Errors.First().Description);
}
result = UserManager.AddClaimsAsync(alice, new Claim[]{
new Claim(JwtClaimTypes.Name, "Alice Smith"),
new Claim(JwtClaimTypes.GivenName, "Alice"),
new Claim(JwtClaimTypes.FamilyName, "Smith"),
new Claim(JwtClaimTypes.WebSite, "http://alice.com"),
}).Result;
if (!result.Succeeded)
{
throw new Exception(result.Errors.First().Description);
}
UserManager.AddToRoleAsync(alice, "Admin").Wait();
//Log.Debug("alice created");
}
}
在我的网络应用程序中,
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "https://localhost:5001";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
但在控制器User.Claims 中没有角色声明,只有用户声明。
所以如果我想拥有角色声明,我应该通过提供 ProfileService 向 IdentityServer 中的用户添加角色声明,就像这样
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var id = context.Subject.FindFirst("sub").Value;
var user = _userManager.FindByIdAsync(id).Result;
var roles = _userManager.GetRolesAsync(user).Result;
var claims = new List<Claim>();
foreach (var role in roles)
{
var roleObj = _roleManager.FindByNameAsync(role).Result;
var roleClaims = _roleManager.GetClaimsAsync(roleObj).Result;
claims.AddRange(roleClaims);
}
var nameClaims = context.Subject.FindAll(JwtClaimTypes.Name);
context.IssuedClaims.AddRange(claims);
context.IssuedClaims.AddRange(nameClaims);
return Task.CompletedTask;
}
这是正确的方式吗?还是有其他推荐的方式?
任何帮助将不胜感激
【问题讨论】:
-
我的回答对您有帮助吗?或者你想让我在我的答案中添加一些东西吗?否则,如果您愿意,请随时接受我的回答。
标签: asp.net-identity identityserver4 claims-based-identity