我正在尝试使用OpenIdConnect进行统一应用身份验证的新模型。
我按照https://azure.microsoft.com/en-us/documentation/articles/active-directory-v2-devquickstarts-dotnet-web/上的说明操作(示例代码https://github.com/AzureADQuickStarts/AppModelv2-WebApp-OpenIdConnect-DotNet)。
我已完成所有设置,我可以登录(使用Azure AD凭据或Microsoft帐户)。默认情况下,我得到(除了ver
,iss
,aud
,exp
等所需的openid声明),以下一组“有用”(如对应用程序开发人员有用的声明:
name
preferred_username
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
http://schemas.microsoft.com/identity/claims/tenantid
该示例使用OpenID Connect并仅请求“openid”作为范围值(参见https://github.com/AzureADQuickStarts/AppModelv2-WebApp-OpenIDConnect-DotNet/blob/complete/WebApp-OpenIDConnect-DotNet/App_Start/Startup.Auth.cs处的配置代码):
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
// (other properties omitted for brevity)
Scope = "openid"
});
OpenID Connect规范(http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims)定义profile
和email
等值,以请求其他声明;但是当我添加这些值时,Microsoft登录页面会出错(AADSTS70011:输入参数'scope'的提供值无效。范围openid配置文件无效。)
如何检索这些额外的声明?具体来说,我想获得用户的电子邮件地址。
答案 0 :(得分:1)
v2 app模型今天支持用户信息的唯一范围是openid。目前,还没有办法获取用户的电子邮件地址。我们将在未来添加此内容,以及使用v2令牌调用Graph API以获取有关用户的更多信息的方法。
答案 1 :(得分:0)
我可以使用此功能获取用户的电子邮件地址:
var claimsIdentity = (ClaimsIdentity)this.User.Identity;
var claim = claimsIdentity.FindFirst("preferred_username");
var claimValue = claim == null ? "" : claim.Value;
现在claimValue有他们的电子邮件地址。这对我和AAD用户以及Microsoft帐户用户都有用。