2017-05-02 12 views
1

APIキーを使用して、サービスから別のサービスへの呼び出しを認証しようとしています。管理サービスは、初めて起動されたときに「サービスアカウントユーザー」を作成します。サービスが別のサービスを呼び出す今とき、私は持っている:APIキーで許可されていません

Client = new JsonServiceClient("http://TheOtherServer:1234") 
{ 
    Credentials = new NetworkCredential(<the string with my api key>, ""), 
}; 
//..... 
var request = new RequestDtoOfOtherServer 
{ 
    //set some request props 
}; 
try 
{ 
    var result = Client.Get(request); 
    //do something with result 
} 
catch (Exception ex) 
{ 
    Log.Error($"Error: {ex}"); 
    throw; 
} 
、私はいつも401不正エラーが出るものは何でも、私は電話サービスの利用者に対して発行された2つのキーから使うキー

。私は受信サービスでRequestLogsFeatureをオンにしましたが、エントリはありません。

私が呼び出すメソッドには[RequiresAnyRole("User", "Administrator", "bizbusops-service", "SYSTEM")]と注釈が付けられ、使用するAPIキーに関連するユーザーはロールbizbusops-serviceにあります。また、WPF UIを使用して、そのユーザー(ユーザー名/パスワードを使用して)でログインすると、エラーなしでこのメソッドにアクセスできます。したがって、サーバー間接続やAPIキーの確立には何か問題があります。

私には何が欠けていますか?

  • 上記のNetworkCredentialコードは、2つのサーバー間でセッションを確立してCookieを発行しますか?
  • Redis DBには、サービスのユーザーアカウントに対して2つのキーが発行されています。両方を使用することはできますか?環境KeyTypeをサーバー側のどこかに設定する必要がありますか? RequestFilterで?

UDATE が、私はそうのようなAuthFeatureプラグインを設定している認証コール受信するサーバー上:

Plugins.Add(new AuthFeature(() => new AuthUserSession(), 
    new IAuthProvider[] { 
     new BizBusAuthProvider(), 
     new ApiKeyAuthProvider(AppSettings) 
     { 
      KeyTypes = new []{"secret", "publishable"}, 
     }, 
    } 
)); 

すべての新しいユーザーのための4つのAPIキーを生成し、この構成を、ものが定義されましたデフォルトで作成された2つです。

+0

あなたAuthFeature構成がどのように見えるんでしょうか? – mythz

+1

ApiKeyAuthProviderを移動して最初のAuthProviderにするか、[資格情報の代わりにBearerTokenを使用する](http://docs.servicestack.net/api-key-authprovider#interoperable)に変更してみてください。 – mythz

+0

資格情報で働いた最初の場所でそれを動かしてください!何故ですか?デフォルトでは 'RequireSecureConnection = true'と思われるので、最初は禁止されたエラーが出ました。これは環境に依存するのか、それとも一般的に有効ですか?それはSSLの権利を意味しますか? (私は開発環境では持っていません)。 – ThommyB

答えて

0

あなたはAPIキーを送信するためにCredentialsを使用するつもりなら、あなたはApiKeyAuthProviderを登録する必要がありますので、それは例えば、リストされた最初のAuthProviderです:

Plugins.Add(new AuthFeature(() => new AuthUserSession(), 
    new IAuthProvider[] { 
     new ApiKeyAuthProvider(AppSettings) 
     { 
      KeyTypes = new []{"secret", "publishable"}, 
     }, 
     new BizBusAuthProvider(), 
    } 
)); 

.NETのWebRequestクラスは、受信したときにこれがそうです401 WWW-Authenticateチャレンジレスポンスでは、リクエストを再試行するときに自動的にCredentialsが追加されます。

そうでなければ、例えば、APIキーを送信するためにBearerTokenを使用することができます。

var client = new JsonServiceClient(baseUrl) { 
    BearerToken = apiKey 
}; 
関連する問題