1

oAuth2 と OpenID を使用したフェデレーション認証/承認を提供するために、IdentityServer3を使用することを検討しています。私たちのプロトタイプは有望であり、基本的なフレームワークが稼働しています。

しかし、問題が発生しました...

ユーザーが認証されると、フレームワークは ID トークンとアクセス トークンをリダイレクト URI のパラメーターとしてクライアント アプリケーションに返します。保護しようとしているアプリケーションの性質上、非常に複雑なクレーム/ロールが必要です。これにより、トークンがかなり大きくなります*。ブラウザーがサポートする最大 URI の長さを超えるほど大きいため、壊れます。

私の質問は、GET ではなく POST トークンを返すように Identity Server を構成できるかどうか知っている人はいますか? または、標準/仕様から逸脱しない別のソリューションはありますか?

*ここで話している主張は、実際にはそれほど大きくありません。例として、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 に答える