2017-02-15 4 views
1

私はいくつかのwebapisを保護するためにIdentityServer4を使用しています。私たちの顧客設定では奇妙なので、異なるクライアントにトークンを発行するためにIdentityServer4を実行する複数のアプリケーションを持つ設定をサポートする必要があります。しかし、これらのクライアントは、いくつかの共通サービスを呼び出すことになります。異なるサーバーを使用してトークンを検証しますか?

これらの共通サービスでは、IdentityServer4の複数インスタンスからトークンを検証できる必要があります。起動時にIdentityServerのインスタンスをリソースサーバーに登録するので、すべてのIdentityServersが同じ方法でトークンに署名していれば、それはうまくいくと思いました。

共有X509証明書を使用するようにIdentityServerを設定すると、別のIdentityServerを使用するように構成されたリソースサーバーで1つのIdentityServerからのトークンを検証できますが、そうではないようです。 Server1からトークンを要求し、Server2を使用してリソースサーバーに送信すると、それらはすべて同じ証明書を使用していても機能しません。

これを行う方法はありますか?

+0

認証用のIDサーバを使用するようにリソースサーバを設定する場合、次のようなものを指定する必要がありますスコープと権限...あなたのIDサーバーはすべてURIと同じ「権限」を持っていますか? – Mashton

+0

Apiリソースの "Auhority"を単一のURIに設定する必要があるので、これに対する答えを見てみたいと思います...同じIdentity Serverインスタンスを指し示す2つのドメイン名を使用しても同様の状況です。 –

答えて

0

JWTまたは参照トークンを使用していますか?

参照トークンは、権限を保持するIdentity-serverによって検証されます。異なるIDサーバーを使用して、別のIDサーバーを使用して、それを検証するサーバー以外のユーザーが提供したトークンを確認することは難しいかもしれません。 JWTを使用している場合は、Discovery-Endpointを使用して公開鍵を取得できます。そして、あなたはあなたがこのような操作を行うことができます...

署名を検証するためにこれを使用することができるはずです。

  // Define the client to access the IdentityServer Discovery-Endpoint 
      var discos = new DiscoveryClient(ConfigurationManager.AppSettings["IdentityserverLocation"]); 
      var disco = await discos.GetAsync(); 

      // get the public key from the discovery-endpoint 
      var keys = disco.KeySet.Keys; 

      //Build the authorization request 
      //param: Disco.AuthorizeEndpoint --> retrieves the authorization url from the identityserver 
      var request = new AuthorizeRequest(disco.AuthorizeEndpoint); 
      var url = request.CreateAuthorizeUrl(
       clientId: ConfigurationManager.AppSettings["ClientId"], 
       responseType: "id_token", 
       scope: "openid profile email", 
       responseMode: OidcConstants.ResponseModes.FormPost, 
       redirectUri: ConfigurationManager.AppSettings["RedirectUrl"], 
       state: CryptoRandom.CreateUniqueId(), 
       nonce: CryptoRandom.CreateUniqueId()); 

      //Try to initiate validation 
      try 
      { 

       // Check if the token data exists in the request, parse is to a correct token 
       var idToken = Request.Form.Get("id_token"); 
       JwtSecurityToken j = new JwtSecurityToken(idToken); 
       var keylist = new List<SecurityKey>(); 
       foreach (var webKey in disco.KeySet.Keys) 
       { 
        var exp = Base64Url.Decode(webKey.E); 
        var mod = Base64Url.Decode(webKey.N); 
        var key = new RsaSecurityKey(new RSAParameters() { Modulus = mod, Exponent = exp }); 
        keylist.Add(key); 
       } 

       //define the parameters for validation of the token 
       var parameters = new TokenValidationParameters 
       { 
        ValidIssuer = disco.Issuer, 
        ValidAudience = "viper", 
        IssuerSigningKeys = keylist, 
       }; 

       var handler = new JwtSecurityTokenHandler(); 
       handler.InboundClaimTypeMap.Clear(); 

       //validate the token using the defined parameters, return the token when validation is succesful 
       var user = handler.ValidateToken(j.RawData, parameters, out var validatedtoken); 
関連する問題