OpenID Connect 在 MVC 会话中获取声明

OpenID Connect obtain claims in MVC Session

我需要在 SQL 数据库中存储用户的唯一标识符。我的应用程序通过 OWIN 使用 OpenID Connect 来根据 Azure AD 对用户进行身份验证,并且基于 MVC 5 框架。我可以通过 http://schemas.microsoft.com/identity/claims/objectidentifier 声明访问用户的 ObjectId。我知道如何获得声明的唯一方法是将委托添加到 "OpenIdConnectAuthenticationOptions" 的 "Notifications" 属性。由于这是应用程序启动的一部分,委托无法将此信息传递给会话。

我看到了具有类似目标的问题的答案,这些问题建议使用图形 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);
  }
},

我想我已经回答了我自己的问题。这很好用。

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