1

我们正在考虑使用IdentityServer3使用 oAuth2 和 OpenID 提供联合身份验证/授权。我们的原型很有前途,我们有一个基本框架正在运行。

然而,我们遇到了一个问题......

用户通过身份验证后,框架将身份和访问令牌作为重定向 URI 的参数返回给客户端应用程序。由于我们正在寻求保护的应用程序的性质,需要有相当复杂的声明/角色。这会产生相当大的令牌*。如此之大,以至于超出了浏览器支持的最大 URI 长度,因此会中断。

所以我的问题是,是否有人知道是否可以配置 Identity Server 以 POST 回令牌而不是 GET?或者是否有另一种不偏离标准/规范的解决方案?

*我们在这里谈论的索赔实际上并没有那么大。作为一个例子,这里是来自 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 长度问题。

4

2 回答 2

1

这不太正确。这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>
于 2015-04-10T14:53:10.510 回答
0

如果令牌太大而无法通过前端通道绑定传递,您应该切换到反向通道绑定,即切换response_typecode并直接从令牌端点获取令牌。

还有一个选项可以在前端通道中使用 POST 传输方法,但它是 OAuth 2.0 的可选扩展(http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html ) 我不认为 IdentityServer 支持它(还)。

于 2015-04-10T11:25:23.150 回答