使用 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>