Мне нужно сохранить уникальный идентификатор пользователя в базе данных SQL. Мое приложение использует OpenID Connect через OWIN для аутентификации пользователей в Azure AD и основано на MVC 5 Framework. Я могу получить доступ к ObjectId пользователя через утверждение http://schemas.microsoft.com/identity/claims/objectidentifier. Единственный способ, которым я знаю, как получить утверждения, - это добавить делегата в свойство «Notifications» объекта «OpenIdConnectAuthenticationOptions». Поскольку это часть запуска приложения, делегат не имеет возможности передать эту информацию сеансу.
Я видел ответы на вопросы с аналогичными целями, в которых рекомендуется использовать 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);
}
},
Думаю, я ответил на свой вопрос. Это прекрасно работает.
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);
Я знаю, давным-давно, но как вы ссылались на «Пользователь» из приложения Startup? Разве это не свойство контроллера? Или вы вытаскивали context.OwinContext.Authentication.User?
У меня есть таймер, я смогу принять его завтра. Спасибо за напоминание.