私は 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()" に似ています。