.NET Core Web API获取access token返回无效请求问题排查
错误说明
调用微软身份平台接口获取access token时返回如下错误:
Invalid request. Request is malformed or invalid. While trying to get the token.
现有代码的错误点
- 请求头
Content-Type拼写错误,当前写为aapplication/x-www-form-urlencoded,开头多了一个冗余的a,正确值为application/x-www-form-urlencoded,拼写错误会直接导致服务端无法识别请求格式。 code参数传值完全不符合要求:当前传入的固定字符串application/json是无效值,该参数需要传入授权码流程第一步用户登录完成后,微软返回的真实授权码,授权码有效期通常仅10分钟,且只能使用一次。- 重复发起请求:代码中连续两次调用
client.Execute(request),如果授权码有效,第一次请求就会消费掉该授权码,第二次请求会因为授权码已被使用直接报错。 - 超时配置不合理:设置
client.Timeout = -1为无限等待,生产环境容易出现请求挂死问题,建议设置合理超时时间(如30秒)。 - 端点与参数不匹配风险:当前使用的是Azure AD v1.0版本的
/oauth2/token端点,如果你是在v2.0端点下注册的应用,需要将resource参数替换为scope参数,否则会报参数无效错误。 redirect_uri校验风险:该参数必须和Azure AD应用注册门户中配置的重定向URI完全一致,包括协议、域名、端口、路径,任何差异都会导致请求被拒绝。
修正后参考代码
[HttpPost("accessToken")] public ActionResult GetToken([FromBody] TokenRequest requestParam) { // 替换大括号内的租户ID,若为多租户应用可填common var client = new RestClient("https://login.microsoftonline.com/{替换为你的租户ID}/oauth2/v2.0/token"); client.Timeout = 30000; var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddParameter("code", requestParam.AuthCode); // 传入真实有效的授权码 request.AddParameter("client_id", "替换为你的应用client_id"); request.AddParameter("client_secret", "替换为你的应用client_secret"); request.AddParameter("redirect_uri", "替换为你在Azure门户配置的重定向URI"); request.AddParameter("grant_type", "authorization_code"); // v2.0端点使用scope参数,按需配置所需权限,v1.0端点可替换为resource参数 request.AddParameter("scope", "https://graph.microsoft.com/.default"); IRestResponse response = client.Execute(request); return Ok(response.Content); } // 自定义请求参数类,接收前端传入的授权码 public class TokenRequest { public string AuthCode { get; set; } }
测试注意事项
- 测试前需要先构造授权请求,引导用户跳转至微软登录页面完成授权,拿到微软重定向回来的code参数后,再调用该接口换取token,不能跳过授权步骤直接传固定值。
- 不需要手动设置Cookie请求头,RestSharp会自动处理请求的基础头信息,手动设置空Cookie反而可能导致请求异常。
- Postman测试时,需要先通过浏览器完成授权流程拿到有效code,再将code传入接口,不能直接调用接口期待返回token。
内容的提问来源于stack exchange,提问作者Sourabh Khandelwal
相关产品推荐
相关产品推荐

