配置Identity Server以使用ASP.NET身份角色

时间:2018-11-07 17:45:47

标签: c# asp.net-identity identityserver4

我正在尝试了解有关Identity Server的更多信息。我目前正在努力使基于角色的授权工作。这是我遵循的步骤:

1)下载示例解决方案:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity

2)运行解决方案,该解决方案开始于:

a)Identity Server项目

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 

和家庭控制器(https://github.com/IdentityServer/IdentityServer4.Samples/blob/release/Quickstarts/6_AspNetIdentity/src/MvcClient/Controllers/HomeController.cs)来自此:

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";

请假定我已将角色正确添加到身份数据库(并将角色与用户相关联)。

1 个答案:

答案 0 :(得分:0)

您要寻找的是AddProfileService()方法,您可以在其中添加IProfileService接口的自定义实现,在其中可以自定义要添加到访问令牌的声明。

以下是使用身份的示例,该示例将角色声明添加到令牌中

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使用您的课程

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