配置身份服务器以使用 ASP.NET 身份角色
Configuring Identity Server to use ASP.NET Identity roles
我正在尝试了解有关 Identity Server 的更多信息。我目前正在努力让基于角色的授权工作。以下是我遵循的步骤:
1) 下载示例解决方案:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity
2) 运行 开始的解决方案:
a) 身份服务器项目
b) MVC 项目
c) API 项目
3) 浏览到 MVC 项目并应用迁移。
4)注册新用户:Bert@Bert.com
5)浏览到:MVC项目中的CallApiUsingUserAccessToken。 API 已按预期到达,因为用户已获得授权。
说我现在想从这个改变 IdentityContoller:
[Authorize]
public class IdentityController : ControllerBase
对此:
[Authorize(Roles="Admin")]
public class IdentityController : ControllerBase
public async Task<IActionResult> CallApiUsingUserAccessToken()
对此:
[Authorize(Roles="Admin")]
public async Task<IActionResult> CallApiUsingUserAccessToken()
我必须对配置进行哪些更改?
今天下午我尝试了一些建议。例如,在 MVCClient 的启动中,我尝试添加:
options.ClaimActions.MapJsonKey("role", "role", "role");
options.TokenValidationParameters.NameClaimType = "name";
options.TokenValidationParameters.RoleClaimType = "role";
请假设我已将角色正确添加到身份数据库(并将角色与用户相关联)。
您正在寻找的是 AddProfileService()
方法,您可以在其中添加 IProfileService 接口的自定义实现,您可以在其中自定义声明以添加到访问令牌。
这是一个使用 Identity 的示例,它将角色声明添加到令牌中
public class ProfileService : IProfileService
{
protected UserManager<ApplicationUser> _userManager;
public ProfileService(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var user = await _userManager.GetUserAsync(context.Subject);
var roles = await _userManager.GetRolesAsync(user);
var claims = new List<Claim>
{
new Claim(JwtClaimTypes.Role, roles.Any() ? roles.First() : "Standard")
};
context.IssuedClaims.AddRange(claims);
}
public async Task IsActiveAsync(IsActiveContext context)
{
var user = await _userManager.GetUserAsync(context.Subject);
context.IsActive = (user != null) && user.LockoutEnabled;
}
}
然后在启动时,告诉idp使用你的class
var builder = services.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
})
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddAspNetIdentity<ApplicationUser>()
.AddProfileService<ProfileService>();
我正在尝试了解有关 Identity Server 的更多信息。我目前正在努力让基于角色的授权工作。以下是我遵循的步骤:
1) 下载示例解决方案:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity
2) 运行 开始的解决方案:
a) 身份服务器项目
b) MVC 项目
c) API 项目
3) 浏览到 MVC 项目并应用迁移。 4)注册新用户:Bert@Bert.com 5)浏览到:MVC项目中的CallApiUsingUserAccessToken。 API 已按预期到达,因为用户已获得授权。
说我现在想从这个改变 IdentityContoller:
[Authorize]
public class IdentityController : ControllerBase
对此:
[Authorize(Roles="Admin")]
public class IdentityController : ControllerBase
public async Task<IActionResult> CallApiUsingUserAccessToken()
对此:
[Authorize(Roles="Admin")]
public async Task<IActionResult> CallApiUsingUserAccessToken()
我必须对配置进行哪些更改?
今天下午我尝试了一些建议。例如,在 MVCClient 的启动中,我尝试添加:
options.ClaimActions.MapJsonKey("role", "role", "role");
options.TokenValidationParameters.NameClaimType = "name";
options.TokenValidationParameters.RoleClaimType = "role";
请假设我已将角色正确添加到身份数据库(并将角色与用户相关联)。
您正在寻找的是 AddProfileService()
方法,您可以在其中添加 IProfileService 接口的自定义实现,您可以在其中自定义声明以添加到访问令牌。
这是一个使用 Identity 的示例,它将角色声明添加到令牌中
public class ProfileService : IProfileService
{
protected UserManager<ApplicationUser> _userManager;
public ProfileService(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var user = await _userManager.GetUserAsync(context.Subject);
var roles = await _userManager.GetRolesAsync(user);
var claims = new List<Claim>
{
new Claim(JwtClaimTypes.Role, roles.Any() ? roles.First() : "Standard")
};
context.IssuedClaims.AddRange(claims);
}
public async Task IsActiveAsync(IsActiveContext context)
{
var user = await _userManager.GetUserAsync(context.Subject);
context.IsActive = (user != null) && user.LockoutEnabled;
}
}
然后在启动时,告诉idp使用你的class
var builder = services.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
})
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddAspNetIdentity<ApplicationUser>()
.AddProfileService<ProfileService>();