3

私は Silverlight 5 を使用して JsonServiceClient で ServiceStack REST サービスを使用していますが、今のところ問題ありません。

現時点では、パス /api で Asp.Net にホストされている ServiceStack にログイン/ログアウトできます。

しかし、ログインした後、Silverlight がホストされているブラウザーの現在のページをユーザーが更新すると、Silverlight アプリケーションが再読み込みされ、セッション/Cookie 情報が消え、ユーザーは再度ログイン/パスワードを入力する必要があります。これは望ましくない動作です。

サーバー側では、Default CredentialsProvider を使用しています。

var appSettings = new AppSettings();
var credentialsProvuder = new CredentialsAuthProvider(appSettings);

//Default route: /auth/{provider}
Plugins.Add(new AuthFeature(() => new CustomUserSession(),
new IAuthProvider[] { credentialsProvuder }));

クライアントでは、RememberMe = true を設定しています。

    public static void TryLogin(string userName, string password, bool rememberMe, Action<AuthResponse, Exception> callBack)
    {
        AuthDto.UserName = userName;
        AuthDto.Password = password;
        AuthDto.RememberMe = rememberMe;
        Client.SendAsync<AuthResponse>(AuthDto, r => TryLoginResponse(callBack, r, null),
                         (r, e) => TryLoginResponse(callBack, r, e));
    }

サービスをテストするために、NuGet テンプレートによって提供される既定の Hello サービスを使用しています。また、クラスに [Authenticate] 属性を設定しましたが、正常に動作しています (サービスはログイン後にのみ自動化されます)。

JsonServiceClient のソース コードを確認したところ、最初のリクエストの後に CookieContainer が作成されていることがわかりました。

サーバーがブラウザに情報を再送信するかどうかを確認するためだけに、サーバーへのダミー呼び出しを試みたので、JsonServiceClient は認証されたユーザー情報を cookiecontainer に入力しますが、成功しません。

私の質問は次のとおりです。以前に認証されたので、クライアントで再度認証する方法は? メソッド (HTTP GET server/api/auth/GetUser?) を呼び出すときに、サーバーが Cookie/セッションを再送信する方法はありますか??

編集

AsyncServiceClient クラスのソース コードをしばらく調べたところ、次のことがわかりました。

// アセンブリ ServiceStack.Common.3.8.3\lib\sl5\ServiceStack.Common.dll

  HttpWebRequest webRequest = (HttpWebRequest) (this.UseBrowserHttpHandling ? WebRequestCreator.BrowserHttp : WebRequestCreator.ClientHttp).Create(new Uri(uriString));
  if (this.StoreCookies && !this.UseBrowserHttpHandling)
  {
    if (this.ShareCookiesWithBrowser)
    {
      if (this.CookieContainer == null)
        this.CookieContainer = new CookieContainer();
      this.CookieContainer.SetCookies(new Uri(this.BaseUri), HtmlPage.Document.Cookies);
    }
    webRequest.CookieContainer = this.CookieContainer;
  }    

上記のコードに見られるように、AsyncServiceClient は各リクエストの前に CookieContainer をチェックし、それが null の場合は、Silverlight の WebClient からの Cookie をブラウザーに設定します。

わかりました。クッキーはクライアントからブラウザに送信されると確信しているので、これでクッキーは問題ありません。

では、ユーザー名とパスワードを再送信せずに、既存の X-UAId に基づいてユーザーを再認証するにはどうすればよいでしょうか?

クライアントで、空の GET を AuthService に送信し、サービスが Cookie とセッションを検証し、ユーザーが認証されたことを示す応答を JsonServiceClient に自動的に返します。

私が欲しいのは、サーバー上のユーザーが認証されてから現在のユーザーを返す場合、サーバーへの要求を行う WCF Ria Services "WebContext.Current.Authentication.LoadUser()" に似ています。

4

1 に答える 1

3

これは少し遅いかもしれませんが、私は同じ問題を抱えていました、そして問題はAsyncServiceClient内にあります。認証が失敗すると、クライアントはBasicAuthenticationヘッダーが追加された別のリクエストを送信します。ただし、この2番目のリクエストがこの行で作成された場合

https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Common/ServiceClient.Web/AsyncServiceClient.cs#L405

その場合、CookieStoreは設定されないため、サーバーが応答したときにCookieは保存されません。上記の行の後にこれを入れてください:

if (StoreCookies)
{
    requestState.WebRequest.CookieContainer = CookieContainer;
}
于 2012-10-21T17:48:25.290 に答える