1

2 つの ID サーバーと 1 つの Web API があります。私がやろうとしているのは、API を 1 つまたは両方の IdentityServer で認証し、1 つがダウンした場合に切り替えることができるようにすることです。可能であれば、実行時に新しい IdentityServer を追加できるようにしたいと考えています。

ここにベストプラクティスはありますか?

今のところこんな感じです。

        app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = $"http://localhost:5000",
            ScopeName = "my.scope",
            RequireHttpsMetadata = false,
            ScopeSecret = "secret",
        });

ポート 5000 で IdentityServer をシャットダウンすると、API を使用できなくなります。これは予想されることです。

4

1 に答える 1

0

これがそれを解決する良い方法であるかどうかはわかりません。しかし、それは一つの方法です。オプションで権限を設定するために、ルーティング サービスに「最初の ID サービス」を要求します。そして、カスタムの IntrospectionBackChannelHandler を追加します

        app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = $"http://{v.Address}:{v.Port}",
            IntrospectionBackChannelHandler = new CustomIntrospectionBackChannelHandler(consulService)

すべての ID サーバーは同じように見えますが、異なるアドレスにあるため、Authority を再度実行する必要はありません。

カスタム イントロスペクトの内部.... 各イントロスペクトをチェックし、「正しい」ID サーバーに送信します。機能しない場合は、別のアイデンティティ サーバーを試します。

var qs = await request.Content.ReadAsStringAsync(); var queryDic = QueryHelpers.ParseQuery(await request.Content.ReadAsStringAsync());

        var token = queryDic["token"];
        var client_id = queryDic["client_id"];
        var client_secret = queryDic["client_secret"];
        var iRequest = new IntrospectionRequest
        {
            ClientId = client_id,
            ClientSecret = client_secret,
            TokenTypeHint = "access_token",
            Token = token
        };

        IntrospectionResponse result = null;

        var svc = await _Consul.GetService(OrbitServices.IdentityServer);
        result = await TrySendAsync(iRequest, svc);
        if (!result.IsActive && result.IsError)
        {
            svc = await _Consul.GetService(OrbitServices.IdentityServer, true);
            result = await TrySendAsync(iRequest, svc);
        }

        var message = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(result.Raw, Encoding.UTF8, "application/json")
        };

        return message;
于 2016-10-06T12:45:17.823 に答える