【问题标题】:OpenID Connect obtain claims in MVC SessionOpenID Connect 在 MVC 会话中获取声明
【发布时间】:2019-05-18 10:06:44
【问题描述】:

我需要在 SQL 数据库中存储用户的唯一标识符。我的应用程序通过 OWIN 使用 OpenID Connect 来针对 Azure AD 对用户进行身份验证,并且基于 MVC 5 框架。我可以通过 http://schemas.microsoft.com/identity/claims/objectidentifier 声明访问用户的 ObjectId。我知道如何获取声明的唯一方法是将委托添加到“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);
  }
},

【问题讨论】:

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


    【解决方案1】:

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

    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?
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 2020-11-19
    • 2015-06-09
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多