【问题标题】:Complete OpenIDConnect auth when requesting via Ajax通过 Ajax 请求时完成 OpenIDConnect 身份验证
【发布时间】:2015-07-25 19:03:45
【问题描述】:

正常的 OpenIDConnect 服务器的工作方式如下:

  • 你去a.com/secure-resource
  • 您会从服务器返回 302
  • 您的浏览器会处理它并将您发送到身份服务器
  • 你在那里登录
  • 它通过POST 将您发送回a.com
  • 您登录 a.com 并在浏览器上返回 a.com/secure-resource

但是我想解决一个场景,但我需要你的帮助。

  • 用户已登录 idServer
  • 用户登录a.com
  • 用户未登录b.com
  • 我们需要向网络服务器b.com(来自另一个域a.com)发送一个ajax调用
  • b.com 配置为使用 OpenIDConnect。
  • 但是由于对b.com的请求是通过Ajax,用户不能正常重定向到idServer。 (我们得到的只是302

我们可以继续通过 Ajax 处理 302(我仍然不确定这是否可行,安全方面)。

但是

IdentityServer/OpenIDConnect 中是否有针对这些情况设计的方案?

【问题讨论】:

    标签: javascript ajax openid openid-connect identityserver3


    【解决方案1】:

    在这种情况下,使用 IdentityServer,您设置服务器 b.com 以使用承载令牌身份验证,然后您需要在 Ajax 调用的标头中使用为 a.com 提供的访问令牌

    $.ajax({
         url: 'http://b.com',
         headers: {
              Authorization: "Bearer " + Your Access Token
             }
         })
    

    JavaScript IdentityServer 客户端示例具有从身份服务器检索令牌的方法,see here

    在控制器中,您可以像这样获取用户和令牌

    // Get the claims values
    var token= (User as ClaimsPrincipal).Claims
                   .Where(c => c.Type == "access_token")
                   .Select(c => c.Value).SingleOrDefault();
    

    在你的应用程序的其他部分你可以使用它

    //Get the current claims principal
    var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
    
    // Get the claims values
    var token = identity.Claims.Where(c => c.Type == "accept_token")
                   .Select(c => c.Value).SingleOrDefault();
    

    【讨论】:

    • 有希望的答案!唯一的事情是a.com 在服务器端对用户进行身份验证(而不是通过 javascript)。有没有办法在那里获得令牌?您是否建议让 a.com 服务器将其令牌写入 cookie 以供 javascript 获取?
    • 是的,服务器 a.com 可以将其存储到 cookie 中
    • 棒极了,但是a.com如何在认证过程中拦截令牌呢? (我在 OWIN 中做)
    • 我添加了一些代码来展示如何访问声明和令牌
    • 酷!我不知道access_token 只是另一种声明类型!
    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多