我正在尝试使用 Microsoft 帐户作为 IdentityServer4 的外部登录,我根据需要在 Microsoft 应用程序门户下配置了我的应用程序,我添加了一个 Web 平台并在 Delegated Permissions 下添加了“电子邮件”以便能够阅读它,这是我的代码访问 Microsoft 帐户:
.AddMicrosoftAccount("MicrosoftAccount", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = "ClientId";
options.ClientSecret = "ClientSecret";
options.Scope.Add("openid");
options.Scope.Add("email");
});
当我运行应用程序时,一切正常,并且在用户输入他的用户名和密码后,会出现一条确认消息,授予我的应用程序访问电子邮件地址的权限,但是当我检查自定义ProfileService
使用中检索到的声明时context.Subject.Claims
,我没有找到任何索赔包含电子邮件地址,所以任何帮助我怎样才能得到它。
这是一个代码示例,显示了我如何访问 GetProfileDataAsync 方法中的声明:
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var claims = context.Subject.Claims; // => there is no claim for the email address
claims = claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList();
context.IssuedClaims = claims.ToList();
}
基于@serpent5 的建议,我编写了一个示例代码来显示问题并将其上传到githug,
示例代码包含 3 个项目
- Fiver.Security.AuthServer(身份服务器)
- Fiver.Security.AuthServer.Client(客户端)
- Fiver.Security.AuthServer.Api(客户端想要访问的安全 API)
我从这篇文章中获取了原始代码
https://www.codeproject.com/Articles/1205745/Identity-Server-with-ASP-NET-Core
正如我上面所说,问题是我将电子邮件添加为范围,但登录后它没有作为 Microsoft 帐户的声明返回..