9

ServiceStackのドキュメントには、ユーザーの認証のサーバー側実装を使用する方法の例がたくさんあります。しかし、クライアント側でユーザー資格情報をどのように設定するのでしょうか。

私はServiceStackを使用して次のJSON RESTようなサービスを利用しています。

var restClient = new JsonServiceClient (baseUri);
var response = restClient.Get<MyResponse> ("/some/service");

リクエストに任意の形式の認証を追加するにはどうすればよいですか?利用したいWebサービスは使用していますOAuth 1.0が、カスタム認証の追加にも興味があります。

私のコードでは、以前にOAuthトークン交換を正常に実行したので、すでに有効なアクセストークンを所有しており、このアクセストークンとそのを使用してすべてのRESTリクエストに署名する必要がありますtoken_secret

4

2 に答える 2

8

ServiceStack のAuthTestsは、ServiceStack サービス クライアントを使用する場合のさまざまな認証方法を示しています。デフォルトでは、BasicAuth と DigestAuth はクライアントに組み込まれています。

var client = new JsonServiceClient(baseUri) {
    UserName = UserName,
    Password = Password,
};

var request = new Secured { Name = "test" };
var response = client.Send<SecureResponse>(request);    

舞台裏では、ServiceStack は通常どおりリクエストを送信しようとしますが、リクエストがサーバーによって拒否されてチャレンジされると、クライアントは同じリクエストを自動的に再試行しますが、今回は Basic/Digest Auth ヘッダーを使用します。

安全なサービスにアクセスしていることがわかっている場合に余分なホップをスキップするには、クライアントに次のように常に BasicAuth ヘッダーを送信するように指示できます。

client.AlwaysSendBasicAuthHeader = true;

認証する別の方法は、サービスを明示的に呼び出すことAuthです (これには CredentialsAuthProvider を有効にする必要があります)。

var authResponse = client.Send<AuthResponse>(new Auth {
    provider = CredentialsAuthProvider.Name,
    UserName = "user",
    Password = "p@55word",
    RememberMe = true,  //important tell client to retain permanent cookies
});

var request = new Secured { Name = "test" };
var response = client.Send<SecureResponse>(request);    

サービスへの呼び出しが成功した後、Authクライアントは認証され、 RememberMeが設定されている場合、クライアントはその後の要求でサーバーによって追加されたセッション Cookie を保持します。これにより、そのクライアントからの将来の要求が認証されます。

于 2012-12-09T18:12:26.743 に答える
7

LocalHttpWebRequestFilterのフックを使用してそれを行う良い方法を見つけたので、自分自身に答えますJsonServiceClient:

OAuth 1.0a で Web サービスを保護するには、すべての http 要求で特別なAuthorization:ヘッダーを送信する必要があります。このヘッダー フィールド内で、ホスト名、リクエスト URL などの入力データとしてリクエストの特性を使用するハッシュ (署名) を送信する必要があります

現在LocalHttpWebRequestFilter、http リクエストが行われる直前に ServiceStack によって呼び出され、基になるHttpWebRequestオブジェクトを公開しているように見えます。ここで、追加のヘッダーを追加して、リクエストの必須フィールドにアクセスできます。

したがって、私の解決策は基本的に次のとおりです。

var client = new JsonServiceClient (baseUri);

client.LocalHttpWebRequestFilter += (request) => {
    // compute signature using request and a previously obtained
    //  access token 
    string authorization_header = CalculateSignature (request, access_token);
  
    request.Headers.Add ("Authorization", authorization_header);
};
var response = client.Get<MySecuredResponse> ("/my/service");

Devdefined.OAuthライブラリを使用して、 CalculateSignature(). リクエスト トークンの作成、ユーザー認証の取得、および OAuth で要求されるリクエスト トークンとアクセス トークンの交換は、上記のサービスが呼び出される前に、ServiceStack の外部で行われます。

于 2012-12-09T19:47:02.153 に答える