我已使用此sample from github尝试使用IdentityServer4和Azure AD进行身份验证。
虽然我有它工作并返回一个令牌,但似乎我希望从Azure AD收到的声明不包含在通过IdentityServer发出的令牌中。
这可能是故意的,我误解了这个流程,但我希望通过Azure AD分配用户的角色(加上租户ID和其他有用的'来自Azure令牌)将能够包含在发给客户端的令牌中。
有人能够为我阐明这一点吗?我可以在这里粘贴代码,但是github代码的链接与我正在使用的代码几乎相同。
答案 0 :(得分:3)
我试图做同样的事情,并最终通过查看IS4文档,Github和StackOverflow来拼凑出一些东西。
您需要配置IProfileService
(Docs)的新实例,以告知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);
//...
}
希望这有帮助。