Asp.net mvc OpenID Connect在MVC会话中获取声明

Asp.net mvc OpenID Connect在MVC会话中获取声明,asp.net-mvc,azure-active-directory,openid-connect,owin-middleware,Asp.net Mvc,Azure Active Directory,Openid Connect,Owin Middleware,我需要在SQL数据库中存储用户的唯一标识符。我的应用程序通过OWIN使用OpenID Connect根据Azure AD对用户进行身份验证,并且基于MVC 5框架。我可以通过声明访问用户的ObjectId。我知道如何获得声明的唯一方法是在“OpenIdConnectAuthenticationOptions”的“Notifications”属性中添加一个委托。由于这是应用程序启动的一部分,委托无法将此信息传递给会话 我已经看到了一些问题的答案,这些问题的目标类似,建议使用Graph API将Us

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

我已经看到了一些问题的答案,这些问题的目标类似,建议使用Graph API将User.Identity.Name与ObjectId匹配。我宁愿避免这样做,因为我的应用程序已经足够消耗资源了

这是我到目前为止所拥有的。我只需要将声明放入会话,或者从会话访问声明。(这并不总是有效,例如,如果用户已经登录,但这是迄今为止我所拥有的最好的)

Notifications=新的OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived=(上下文)=>
{
IEnumerable claims=context.AuthenticationTicket.Identity.claims;
Claim objectId=claims.First(Claim=>Claim.Type=“http://schemas.microsoft.com/identity/claims/objectidentifier");
// ???
返回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);

我有一个计时器,明天我就可以接受了。谢谢你提醒我。很久以前,我知道,但是你是如何从应用程序启动中引用“用户”的?这不是控制器的属性吗?或者您正在提取context.OwinContext.Authentication.User?
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);