これがそれを解決する良い方法であるかどうかはわかりません。しかし、それは一つの方法です。オプションで権限を設定するために、ルーティング サービスに「最初の 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;