Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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
C# &引用;无效的“授权”;来自角度SPA的DocuSign令牌api的错误_C#_Docusignapi_Asp.net Core Webapi - Fatal编程技术网

C# &引用;无效的“授权”;来自角度SPA的DocuSign令牌api的错误

C# &引用;无效的“授权”;来自角度SPA的DocuSign令牌api的错误,c#,docusignapi,asp.net-core-webapi,C#,Docusignapi,Asp.net Core Webapi,我使用下面的代码从docusign获取访问令牌和刷新令牌。 但我总是收到无效的授权错误。我正在粘贴下面的代码 [HttpGet("GetDocToken")] [AllowAnonymous] public async Task<IActionResult> getToken(string docCode) { var x = docCode.Length; var client = new HttpClient();

我使用下面的代码从docusign获取访问令牌和刷新令牌。 但我总是收到无效的授权错误。我正在粘贴下面的代码

    [HttpGet("GetDocToken")]
    [AllowAnonymous]
    public async Task<IActionResult> getToken(string docCode)
    {
        var x = docCode.Length;
        var client = new HttpClient();
        var authCode=Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("ced8998a-4387-4f30-9ab7-51c0d1af49bf:d7c3ccd4-22fa-4f18-a540-ddf11d8b2c9f"));
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authCode);
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

        var requestContent = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("grant_type", "authorization_code"),
            new KeyValuePair<string, string>("code", docCode),
            new KeyValuePair<string, string>("redirect_uri", "http://localhost:4200/auth")
        });

        HttpResponseMessage response = await client.PostAsync("https://account-d.docusign.com/oauth/token", requestContent);
        string resultContent = response.Content.ReadAsStringAsync().Result;
        return Ok(response.Content.ReadAsStringAsync());
    }
[HttpGet(“GetDocToken”)]
[异名]
公共异步任务getToken(字符串docCode)
{
var x=docCode.Length;
var client=新的HttpClient();
var authCode=Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(“ced8998a-4387-4f30-9ab7-51c0d1af49bf:d7c3ccd4-22fa-4f18-a540-ddf11d8b2c9f”);
client.DefaultRequestHeaders.Authorization=new System.Net.Http.Headers.AuthenticationHeaderValue(“基本”,authCode);
client.DefaultRequestHeaders.Accept.Add(新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“application/x-www-form-urlencoded”);
var requestContent=newformurlencodedcontent(new[]{
新的KeyValuePair(“授权类型”、“授权代码”),
新的KeyValuePair(“代码”,docCode),
新的KeyValuePair(“重定向uri”)http://localhost:4200/auth")
});
HttpResponseMessage响应=等待客户端。PostAsync(“https://account-d.docusign.com/oauth/token“,内容);
字符串resultContent=response.Content.ReadAsStringAsync().Result;
返回Ok(response.Content.ReadAsStringAsync());
}

我的假设是,您已从DocuSign标识系统收到身份验证码,并试图将其交换为访问令牌

有几个问题:

错误地指示重定向uri应包含在请求中。文档中的示例请求确实正确地表明,请求应仅包括
grant\u类型
code
参数

注意:虽然第4.1(d)节确实指出应该包括重定向url,但DocuSign通常不包括它

我的猜测是DocuSign将忽略redirect_uri参数,但您可能希望尝试将其忽略

另一个问题是计时问题:您从DocuSign收到的授权码仅在一分钟左右有效。如果您没有立即使用授权代码(您的代码为
docCode
),则您将收到无效授权错误

已知良好示例软件 我建议你也去看看。您可以使用协议窥视器查看它在身份验证过程中的具体操作

使用图书馆 我还建议您寻找一个OAuth授权代码客户机库,您可以使用它来代替滚动自己的库

例如,您是否正在设置和检查状态值?这样做对于阻止CSRF攻击非常重要。看这个

补充 我也不清楚您是否使用了正确的值作为授权代码

我认为流程应该是:

  • 用户在Angular应用程序中按“Authenticate with DocuSign”
  • 用户的浏览器无法访问DocuSign身份验证服务器。此时,浏览器不再运行Angular应用程序
  • 当用户使用DocuSign进行身份验证时,用户的浏览器和DocuSign身份验证服务器来回交换HTML
  • 用户使用DocuSign完成身份验证过程
  • DocuSign向浏览器发送重定向响应,通知浏览器获取重定向url。重定向(和GET)包括
    code
    state
  • 您的服务器(不是Angular应用程序)接收GET请求
  • 您的服务器应该:
  • 提取
    code
    state
    查询参数
  • 验证
    状态是否与步骤2中发送的相同
  • 向DocuSign发出POST请求,以将授权代码交换为访问令牌
  • 使用Angular程序响应浏览器
  • Angular程序现在再次在浏览器上运行
  • 使用隐式授权
    您的另一个选择是使用隐式授权。这样,您就不需要服务器组件。通过隐式授权,您的Angular程序可以处理流程。

    您使用什么提交?“您使用什么提交?”此评论有点让人困惑。我不明白这个问题,我想说的是,您使用什么样的UI技术将数据提交到服务器?Jquery?有棱角的反应?实际上我用angular做前端。从那里我调用我的web api。在该web api中,我为令牌调用docusign api。上面我粘贴的是c代码