Azure AD OAuth2认证在IIS Express正常,IIS环境报400错误排查
1. Scope参数格式错误(最可能的直接原因)
你的代码中scope参数的拼接存在明显错误:
postData += "&scope=openid&20email&20profile"
在application/x-www-form-urlencoded格式中,空格需编码为%20,而&是参数分隔符。当前写法会将scope设为openid,同时额外生成20email和20profile两个无效参数,直接触发Azure AD返回400错误。
修复方式:改为正确的编码格式:
postData += "&scope=openid%20email%20profile"
或更稳妥地对scope值做URL编码:
postData += "&scope=" & HttpUtility.UrlEncode("openid email profile")
2. IIS环境的redirect_uri未在Azure AD应用注册中配置
Azure AD要求获取token时的redirect_uri必须与应用注册中配置的完全一致(包括端口号)。你提到IIS与IIS Express的redirect_uri仅端口不同,大概率是IIS使用的端口对应的地址未添加到Azure AD应用的「认证」→「重定向URI」列表中。
修复方式:
- 登录Azure门户,找到目标AD应用注册
- 进入「认证」页面,添加IIS环境对应的完整redirect_uri(例如
https://localhost:8080/your-callback-page) - 保存配置后重试
3. redirect_uri未做URL编码
代码中直接拼接redirect_uri,若地址包含特殊字符(如路径斜杠、查询参数等),未编码会导致请求格式错误。即使仅端口不同,也需确保整个URI被正确编码。
修复方式:对AuthRedirectUri编码后再拼接:
postData += "&redirect_uri=" & HttpUtility.UrlEncode(AuthRedirectUri)
4. 请求编码方式不匹配
你使用ASCIIEncoding处理请求体,但Azure AD的OAuth接口要求UTF-8编码。ASCII编码可能导致含非ASCII字符的client_id、client_secret等参数乱码,引发400错误。
修复方式:替换为UTF8Encoding:
Dim encoding As New UTF8Encoding() Dim byteArray As Byte() = encoding.GetBytes(postData)
5. TLS版本过低
IIS环境可能默认使用低版本TLS(如TLS 1.0),而Azure AD已不再支持旧版本TLS,会导致请求被拒绝返回400。
修复方式:创建HttpWebRequest前强制设置TLS 1.2:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 Dim httpWReq As HttpWebRequest = DirectCast(WebRequest.Create("https://login.microsoftonline.com/" & TenantID & "/oauth2/v2.0/token"), HttpWebRequest)
内容的提问来源于stack exchange,提问作者Tony D

