Asp.net MVC调用Adobe Sign API获取AccessToken遇401未授权问题
问题场景
我正在使用Asp.net MVC开发,此前通过DocuSign实现了向客户发送PDF邮件获取签名的功能,现在客户要求改用Adobe Sign。尝试通过代码生成access token时,尽管凭据正确,却始终收到401 Unauthorized响应。但通过Adobe Sign官网生成的token在代码中可正常使用,只是该token1小时后过期。
相关代码如下:
string clientId = "**********"; string clientSecret = "*************"; var tokenUrl = "https://secure.na3.adobesign.com/oauth/v2/token"; var tokenRequestBody = new Dictionary<string, string> { {"client_id", clientId}, {"client_secret", clientSecret}, {"grant_type", "client_credentials"}, {"scope", "user_read user_write user_login agreement_read agreement_write agreement_send library_write widget_write library_read widget_read"} }; var tokenResponse = await client.PostAsync(tokenUrl, new FormUrlEncodedContent(tokenRequestBody)); if (tokenResponse.IsSuccessStatusCode) { // 无法进入此代码块 }
排查与解决步骤
匹配OAuth端点与应用环境
确保请求的tokenUrl和你的Adobe Sign应用注册区域一致:- 北美环境:
https://secure.na3.adobesign.com/oauth/v2/token - 欧盟环境:
https://secure.eu1.adobesign.com/oauth/v2/token - 亚太环境:
https://secure.ap1.adobesign.com/oauth/v2/token
区域不匹配会直接返回401错误。
- 北美环境:
启用Client Credentials授权模式
Adobe Sign的Client Credentials模式需要在开发者控制台手动开启:- 登录Adobe Sign开发者控制台,找到目标应用
- 进入「OAuth Settings」页面
- 勾选「Client Credentials」选项并保存
官网生成的token属于Authorization Code模式,和Client Credentials是独立权限,前者可用不代表后者已启用。
移除无效Scope
user_login权限不适用于Client Credentials模式(该模式为服务端到服务端授权,无需用户登录权限),移除后重试:{"scope", "user_read user_write agreement_read agreement_write agreement_send library_write widget_write library_read widget_read"}无效Scope会触发权限验证失败。
校验Client ID与Secret的准确性
直接从开发者控制台复制Client ID和Secret,避免手动输入时的大小写、空格或特殊字符错误,不要在字符串前后添加多余引号或空格。确认请求头Content-Type
虽然FormUrlEncodedContent默认会设置Content-Type: application/x-www-form-urlencoded,但如果存在自定义拦截器修改请求头,可能导致验证失败,可手动强制设置:var content = new FormUrlEncodedContent(tokenRequestBody); content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); var tokenResponse = await client.PostAsync(tokenUrl, content);排查网络拦截问题
如果服务器在企业内网,检查是否有代理或防火墙拦截了对Adobe Sign端点的请求,可在本地开发环境直接请求端点,排除网络层面的影响。
内容的提问来源于stack exchange,提问作者Umer Abdul Wahid

