我需要在SQL数据库中存储用户的唯一标识符。我的应用程序使用基于OVC的OpenID Connect来针对Azure AD验证用户身份,并且基于MVC 5框架。我可以通过http://schemas.microsoft.com/identity/claims/objectidentifier声明访问用户的ObjectId。我知道如何获取索赔的唯一方法是将委托添加到“ OpenIdConnectAuthenticationOptions”的“ Notifications”属性中。由于这是应用程序启动的一部分,因此委托人无法将该信息传递给会话。
我看到了具有相似目标的问题的答案,建议使用Graph API将User.Identity.Name与ObjectId匹配。我宁愿避免这样做,因为我的应用程序已经足够消耗资源了。
这是我到目前为止所拥有的。我只需要将索赔放入会话中,或从会话中访问索赔即可。 (这并不总是可行的,例如,如果用户已经登录,但这是迄今为止我最好的)
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = (context) =>
{
IEnumerable<Claim> claims = context.AuthenticationTicket.Identity.Claims;
Claim objectId = claims.First(claim => claim.Type == "http://schemas.microsoft.com/identity/claims/objectidentifier");
// ???
return Task.FromResult(0);
}
},
答案 0 :(得分:0)
我想我已经回答了我自己的问题。效果很好。
ClaimsIdentity identity = User.Identity as ClaimsIdentity;
Guid objectId = new Guid(identity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value);
Guid tenantId = new Guid(identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value);