使用 IdentityServer3 时重定向 Uri 太长
Redirect Uri too long when using IdentityServer3
我们正在考虑使用 IdentityServer3 使用 oAuth2 和 OpenID 提供联合身份验证/授权。我们的原型很有前途,我们有一个基本框架 运行。
但是,我们遇到了一个问题...
在用户通过身份验证后,框架 returns 将身份和访问令牌作为重定向 URI 的参数返回给客户端应用程序。由于我们希望保护的应用程序的性质,需要非常复杂 claims/roles。这导致相当大的令牌*。它们太大以至于超出了浏览器支持的最大 URI 长度,因此中断。
所以我的问题是,有人知道是否可以将 Identity Server 配置为 POST 返回令牌而不是 GET 吗?或者有没有其他不偏离standards/specification的解决方案?
*我们这里所说的索赔实际上并没有那么大。作为示例,这里是来自 IdentityServer3 代码示例的声明
Claims = new Claim[]
{
new Claim(Constants.ClaimTypes.Name, "Alice Smith"),
new Claim(Constants.ClaimTypes.GivenName, "Alice"),
new Claim(Constants.ClaimTypes.FamilyName, "Smith"),
new Claim(Constants.ClaimTypes.Email, "AliceSmith@email.com"),
new Claim(Constants.ClaimTypes.Role, "Admin"),
new Claim(Constants.ClaimTypes.Role, "Geek"),
new Claim(Constants.ClaimTypes.WebSite, "http://alice.com"),
new Claim(Constants.ClaimTypes.Address, "{ \"street_address\": \"One Hacker Way\", \"locality\": \"Heidelberg\", \"postal_code\": 69118, \"country\": \"Germany\" }")
}
如果我们为此添加另一个与地址声明大小相同的声明,那么我们就会遇到 URI 长度问题。
如果令牌太大而无法通过前端通道绑定传递,您应该切换到后端通道绑定,即将 response_type
切换为 code
并直接从令牌端点获取令牌.
还有一个选项可以在前端通道中使用 POST 传输方法,但它是 OAuth 2.0 的可选扩展 (http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html),我认为 IdentityServer 不支持它 (还没有)。
这不太正确。就是 responseMode
需要改成 form_post
.
var authorizationUri = new Uri(
client.CreateAuthorizeUrl(
clientId: "myclient",
responseType: "code id_token token",
scope: "openid Resource roles",
redirectUri: "oob://application/tokens",
responseMode: "form_post"));
IdentityServer 然后会将响应参数编码为 HTML 表单值,然后 POST
将这些返回给您的客户端。
<form method="post" action="oob://application/tokens">
<input type="hidden" name="code" value="aca7b48d8a944ae6a9b91283e26b1740" />
<input type="hidden" name="id_token" value="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" />
<input type="hidden" name="access_token" value="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" />
<input type="hidden" name="token_type" value="Bearer" />
<input type="hidden" name="expires_in" value="3600" />
<input type="hidden" name="scope" value="openid Resource roles" />
<input type="hidden" name="session_state" value="AHzV1QYcGi-W95OYJAganx0piP5y_km_4q9qsuvAacg.e8ca5c9876007e40bf3cc89314c86c0f" />
</form>
我们正在考虑使用 IdentityServer3 使用 oAuth2 和 OpenID 提供联合身份验证/授权。我们的原型很有前途,我们有一个基本框架 运行。
但是,我们遇到了一个问题...
在用户通过身份验证后,框架 returns 将身份和访问令牌作为重定向 URI 的参数返回给客户端应用程序。由于我们希望保护的应用程序的性质,需要非常复杂 claims/roles。这导致相当大的令牌*。它们太大以至于超出了浏览器支持的最大 URI 长度,因此中断。
所以我的问题是,有人知道是否可以将 Identity Server 配置为 POST 返回令牌而不是 GET 吗?或者有没有其他不偏离standards/specification的解决方案?
*我们这里所说的索赔实际上并没有那么大。作为示例,这里是来自 IdentityServer3 代码示例的声明
Claims = new Claim[]
{
new Claim(Constants.ClaimTypes.Name, "Alice Smith"),
new Claim(Constants.ClaimTypes.GivenName, "Alice"),
new Claim(Constants.ClaimTypes.FamilyName, "Smith"),
new Claim(Constants.ClaimTypes.Email, "AliceSmith@email.com"),
new Claim(Constants.ClaimTypes.Role, "Admin"),
new Claim(Constants.ClaimTypes.Role, "Geek"),
new Claim(Constants.ClaimTypes.WebSite, "http://alice.com"),
new Claim(Constants.ClaimTypes.Address, "{ \"street_address\": \"One Hacker Way\", \"locality\": \"Heidelberg\", \"postal_code\": 69118, \"country\": \"Germany\" }")
}
如果我们为此添加另一个与地址声明大小相同的声明,那么我们就会遇到 URI 长度问题。
如果令牌太大而无法通过前端通道绑定传递,您应该切换到后端通道绑定,即将 response_type
切换为 code
并直接从令牌端点获取令牌.
还有一个选项可以在前端通道中使用 POST 传输方法,但它是 OAuth 2.0 的可选扩展 (http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html),我认为 IdentityServer 不支持它 (还没有)。
这不太正确。就是 responseMode
需要改成 form_post
.
var authorizationUri = new Uri(
client.CreateAuthorizeUrl(
clientId: "myclient",
responseType: "code id_token token",
scope: "openid Resource roles",
redirectUri: "oob://application/tokens",
responseMode: "form_post"));
IdentityServer 然后会将响应参数编码为 HTML 表单值,然后 POST
将这些返回给您的客户端。
<form method="post" action="oob://application/tokens">
<input type="hidden" name="code" value="aca7b48d8a944ae6a9b91283e26b1740" />
<input type="hidden" name="id_token" value="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" />
<input type="hidden" name="access_token" value="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" />
<input type="hidden" name="token_type" value="Bearer" />
<input type="hidden" name="expires_in" value="3600" />
<input type="hidden" name="scope" value="openid Resource roles" />
<input type="hidden" name="session_state" value="AHzV1QYcGi-W95OYJAganx0piP5y_km_4q9qsuvAacg.e8ca5c9876007e40bf3cc89314c86c0f" />
</form>