Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在标头中传递openid connect oauth2承载令牌_Javascript_Oauth 2.0_Asp.net Web Api2_Thinktecture Ident Server_Openid Connect - Fatal编程技术网

Javascript 在标头中传递openid connect oauth2承载令牌

Javascript 在标头中传递openid connect oauth2承载令牌,javascript,oauth-2.0,asp.net-web-api2,thinktecture-ident-server,openid-connect,Javascript,Oauth 2.0,Asp.net Web Api2,Thinktecture Ident Server,Openid Connect,背景 我已经实现了Thinktecture.IdentityServer.V3(openID连接)。我已将OAuth2承载令牌以以下形式返回给我的javascript客户端(隐式流): { "id_token": "eyJ0eXAiOiJKV1QiLCJh...", // JWT "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni..", // JWT "token_type": "Bearer", "expires_in":

背景

我已经实现了Thinktecture.IdentityServer.V3(openID连接)。我已将OAuth2承载令牌以以下形式返回给我的javascript客户端(隐式流):

{
  "id_token": "eyJ0eXAiOiJKV1QiLCJh...",  // JWT
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni..", // JWT
  "token_type": "Bearer",
  "expires_in": "3600",
  "scope": "openid profile read write email",
  "state": "1299139105028949"
}
但在所有示例中,它们仅在调用服务时将访问令牌传递给资源提供者

 $.ajax({
         url: 'http://localhost:2727/Account/123/Get',
         headers: {
              Authorization: "Bearer " + $scope.response.access_token
             }
         })
假设

如果我做对了,我就用访问令牌进行身份验证。然后,我根据id_令牌中的声明进行授权(我不想进行单独的DB调用-我希望它完全独立)

问题

我将如何通过ajax(假设我已经设置了CORS等)将这些信息传递给我的webapi2端点?我需要连接什么中间件来验证它?(我猜是一个令牌验证器和一个claimsManager,但是有太多了,我无法决定哪一个是正确的)


非常感谢您的帮助

您似乎使用了AngularJS,所以您可以使用
$http
服务在标头中设置令牌

例如:

$http.post("/login", credentials).then(function(response) {
    $httpProvider.defaults.headers.common["Authorization"] = "Bearer " + $scope.response.access_token;
});
您必须在每个会话中执行一次

更新

使用jQuery这样的东西

     //This repesent the token you got after login
     var authToken = {
                     "id_token": "eyJ0eXAiOiJKV1QiLCJh...",  // JWT
                     "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni..", // JWT
                     "token_type": "Bearer",
                     "expires_in": "3600",
                     "scope": "openid profile read write email",
                     "state": "1299139105028949"
                     }
     $.ajax({
            url: "http://localhost:2727/Account/123/Get",
            type: "get",
            dataType: "json",
            beforeSend: function (request)
            {
                request.setRequestHeader("Authorization", authToken.token_type + " " + authToken.access_token);
            }
    });

id_令牌用于客户端-必须由客户端验证(如果客户端没有必要的加密库,则由idsrv中的标识令牌验证端点验证)。然后使用访问令牌访问资源。

thinktecture javascript隐式示例使用angular,我实际上使用的是knockout。演示将传递access_令牌,但我也希望传递整个OAuth2令牌,以便我也可以验证id_令牌,我如何创建标头来传递该信息?问题在于“承载者”“+$scope.response.access_令牌”仅被传递,而不是整个令牌。我将尝试“X-AUTH-TOKEN”+$scope.response,并查看它的作用。好的,我已经更新了我的代码段!这应该是正确的方法。我发现了一些信息嗨,代码片段显示只是传递了访问令牌。难道不可能以这种方式传递整个令牌吗?我是否需要在不同的头中发送id_令牌?那么,您将如何通过id令牌中的角色声明来保护资源?还是我在这里遗漏了什么?感谢您没有使用id\u令牌保护资源。将角色声明放入访问令牌中。好了,现在有意义了!感谢您的帮助。添加到@PeterLea的答案中,ID令牌仅用于标识,角色基本上是授权的手段,因此在访问令牌中是有意义的。。ID令牌用于客户端对最终用户/资源所有者进行身份验证,并使用ID令牌获取其信息,对资源的访问完全由访问令牌控制