OpenID Connect在MVC会话中获取声明

时间:2018-12-18 02:01:07

标签: asp.net-mvc azure-active-directory openid-connect owin-middleware

我需要在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);
  }
},

1 个答案:

答案 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);