如何通过服务端代码从HTTP POST的FormData获取Azure AD ID Token
解决Azure AD回调中读取FormData里ID Token的问题
嗨,我完全懂你踩的这个坑——Chrome DevTools把FormData放在「网络>请求头」标签页下的设计确实容易误导人,但FormData本质是POST请求的请求体内容,根本不在Request.Headers集合里,所以你遍历Headers肯定找不到它!
正确的读取方式
在ASP.NET(包括VB.NET和C#)中,表单提交的FormData数据是通过Request.Form集合来访问的,这才是专门处理application/x-www-form-urlencoded类型请求体的对象(Azure AD的回调请求正好是这个类型)。
VB.NET 代码示例
' 直接获取ID Token(键名通常是"id_token",和你在DevTools里看到的一致) Dim idToken As String = Request.Form("id_token") ' 如果需要遍历所有FormData键值对(替代你之前遍历Headers的逻辑) For Each key As String In Request.Form.AllKeys Dim values As String() = Request.Form.GetValues(key) txtOutput.Text += "Key: " & key & vbCrLf For i As Integer = 0 To values.Length - 1 txtOutput.Text += "Value " & i.ToString() & ": " & Server.HtmlEncode(values(i)) & vbCrLf & vbCrLf Next Next
C# 代码示例(方便你转换)
// 直接读取ID Token string idToken = Request.Form["id_token"]; // 遍历所有FormData键值对 foreach (string key in Request.Form.AllKeys) { string[] values = Request.Form.GetValues(key); txtOutput.Text += "Key: " + key + "\n"; for (int i = 0; i < values.Length; i++) { txtOutput.Text += "Value " + i.ToString() + ": " + Server.HtmlEncode(values[i]) + "\n\n"; } }
额外说明
- 如果你遇到的是
multipart/form-data类型的请求(比如带文件上传的表单),需要用Request.Files配合Request.Form来处理,但Azure AD的登录回调一般不会用这个类型,所以上面的代码完全适用。 - 确认一下请求的Content-Type是否为
application/x-www-form-urlencoded,这是表单提交的默认类型,也是Azure AD回调的标准类型。
内容的提问来源于stack exchange,提问作者James Gragert
相关产品推荐
相关产品推荐

