基本認証を実装するServiceStackサービスをAsp.Net上に作成しました。サービスルートではすべてが正常に機能しています。ログインでき、後続の呼び出しで検証されるセッションCookieを取得します。これらのリクエストにはHttpClientを使用しています。
同じAsp.Netサービスで実行されるSignalRハブもありますが、プリンシパルがハブメソッドで認証されていません。
基本的に必要なのは、ServiceStackがハブへの呼び出しをインターセプトし、セッションCookieを検証し、Context.User.Identityにデータを入力して、認証済みとしてマークすることです。その設定ができれば、ハブの単純な[Authorize]属性が残りの作業を行います。
これが私のコードのサンプルです:
// set up a HttpClient with a cookie container to hold the session cookie
var cookieJar = new CookieContainer();
var handler = new HttpClientHandler { CookieContainer = cookieJar, UseCookies = true, UseDefaultCredentials = false };
var client = new HttpClient(handler) { BaseAddress = _baseUri };
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", userName, password))));
// do client login and get response with session cookie...
var response = client.PostAsync(...);
// add the cookies to the SignalR hub connection
var responseCookies = cookieJar.GetCookies(_baseUri);
var cookieContainer = new CookieContainer();
foreach (Cookie cookie in responseCookies)
{
cookieContainer.Add(cookie);
}
_hubConnection = new HubConnection(_baseUri.ToString()) { CookieContainer = cookieContainer };
この設定後、セッションCookieは呼び出しごとにハブに送信されます。どういうわけか、ServiceStackがそれらの要求をインターセプトし、認証されたユーザーを設定する必要があります。