IdentityServer4中的Azure AD声明

时间:2018-02-12 17:54:21

标签: azure azure-active-directory identityserver4

我已使用此sample from github尝试使用IdentityServer4和Azure AD进行身份验证。

虽然我有它工作并返回一个令牌,但似乎我希望从Azure AD收到的声明不包含在通过IdentityServer发出的令牌中。

这可能是故意的,我误解了这个流程,但我希望通过Azure AD分配用户的角色(加上租户ID和其他有用的'来自Azure令牌)将能够包含在发给客户端的令牌中。

有人能够为我阐明这一点吗?我可以在这里粘贴代码,但是github代码的链接与我正在使用的代码几乎相同。

1 个答案:

答案 0 :(得分:3)

我试图做同样的事情,并最终通过查看IS4文档,Github和StackOverflow来拼凑出一些东西。

您需要配置IProfileServiceDocs)的新实例,以告知IdentityServer4您想要哪些用户身份(从您的案例中从Azure AD获取)的其他声明被传递给客户。

示例可能如下所示:

public class CustomProfileService : IProfileService
{
  public Task GetProfileDataAsync(ProfileDataRequestContext context)
  {
    // Get the 'upn' claim out from the identity token returned from Azure AD.
    var upnClaim = context.Subject.FindFirst(c => c.Type == ClaimTypes.Upn);

    // Get 'firstname' and 'givenname' claims from the identity token returned from Azure AD.
    var givenNameClaim = context.Subject.FindFirst(c => c.Type == ClaimTypes.GivenName);
    var surNameClaim = context.Subject.FindFirst(c => c.Type == ClaimTypes.Surname);

    // Add the retrieved claims into the token sent from IdentityServer to the client.
    context.IssuedClaims.Add(upnClaim);
    context.IssuedClaims.Add(givenNameClaim);
    context.IssuedClaims.Add(surNameClaim);
  }

  public Task IsActiveAsync(IsActiveContext context)
  {
      context.IsActive = true;
      return Task.CompletedTask;
  }
}

然后,您需要在Startup.cs注册此服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentityServer()
            .AddDeveloperSigningCredential()

            // Register the new profile service. 
            .AddProfileService<CustomProfileService>();
}

最后,在AccountController.cs内部(在IdentityServer4项目中 - 我假设您已经拥有此项,如果没有,请参见here了解初学者设置),您需要添加以下内容到ExternalLoginCallback()

[HttpGet]
public async Task<IActionResult> ExternalLoginCallback()
{

    //...

    // this allows us to collect any additonal claims or properties
    // for the specific protocols used and store them in the local auth cookie.
    // this is typically used to store data needed for signout from those protocols.
    var additionalLocalClaims = new List<Claim>();

    // ADD THIS LINE TO TELL IS4 TO ADD IN THE CLAIMS FROM AZURE AD OR ANOTHER EXTERNAL IDP.
    additionalLocalClaims.AddRange(claims);

    //...

}

希望这有帮助。