Azure Active Directory OAuth 2.0 授权给出错误请求

Azure Active Directory OAuth 2.0 Authorization gives Bad Request

请求授权码时,如果状态url参数有以下值,https://login.microsoftonline.com/oauth2/authorize给我一个错误的请求。

state=%3C%3CMULE_EVENT_ID%3D0-6cadfe22-e9ea-11e6-99ff-205120524153%3E%3E

如果我删除编码值:<<>>,效果很好。目前我有一些限制,我无法删除这些值。

documentation 中说 "state" 是包含在请求中的值,该值也将在令牌响应中返回。 可以是任意内容的字符串

那么,文档似乎有点错误。我测试了各种状态字符串,导致它始终失败的原因是状态字符串以 %3C 开头。所以 less-than 符号在字符串的某些地方是可以的。

编辑:确实发生了一些奇怪的事情。

这失败了:

state=MUL%3CE_EVENT_ID%3D0-6cadfe22-e9ea-11e6-99ff-205120524153%3E%3E

但这行得通:

state=MULE%3C_EVENT_ID%3D0-6cadfe22-e9ea-11e6-99ff-205120524153%3E%3E

但这也失败了:

state=MULE_%3CEVENT_ID%3D0-6cadfe22-e9ea-11e6-99ff-205120524153%3E%3E

我的理论是它不允许任何看起来像有效 HTML 标签的东西。这就是为什么它允许 %3C_....%3D,但 *%3Ca%3e 不允许。您可以将 a 替换为任何字符 a-z。所以 HTML 元素是 no-no :)

虽然 https://www.rfc-editor.org/rfc/rfc6749#appendix-A.5 (referencing ABNF syntax for that field, which is essentially all printable characters including space, VSCHAR, https://www.rfc-editor.org/rfc/rfc5234).

中允许使用双 << >>,但它们在语义上似乎不正确

但是,当我们查看状态字段的预期用途时,它用于从服务发送回令牌,以便您的应用程序能够验证本地状态以避免 CSRF 攻击。

在大多数情况下,一个短字符串就足够了,如果您保持字符串短,您可能会帮自己一个忙,节省线路上的字节数和额外的解析开销。

这里有一个关于使用 oauth2 端点的很好的概述(诚然与 Bing 广告,但原则和建议适用于这种情况):

https://msdn.microsoft.com/en-us/library/bing-ads-user-authentication-oauth-guide.aspx

如果我能找到状态字段的确切限制,我会更新我的答案。