如何使用服务堆栈身份验证服务的 cookie/会话在客户端上加载经过身份验证的用户



我正在使用Silverlight 5将ServiceStack REST服务与JsonServiceClient一起使用,现在还可以。

目前,我可以在路径/api 处登录/注销托管在 Asp.Net 的 ServiceStack 中。

但是在我登录后,如果用户刷新托管 Silverlight 的浏览器当前页面,则会重新加载 Silverlight 应用程序,并且会话/cookie 信息将消失,从而强制用户再次登录/密码。这是一种不受欢迎的行为。

在服务器端,我使用的是默认凭据提供程序:

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

在客户端上,我正在设置 记住我 = 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类的源代码,我发现:

AssemblyServiceStack.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,则将 Cookie 从 Silverlight 的 WebClient 设置为浏览器。

好的,现在我们对cookie没问题了,因为我确定它们是从客户端发送到浏览器的。

那么,如何在不重新发送用户名和密码的情况下根据现有的 X-UAId 重新验证用户?

我希望如果在客户端中,我向身份验证服务发送一个空的 GET 并且服务验证 cookie、会话并自动向 JsonServiceClient 返回响应,表明用户已经过身份验证。

我想要的类似于WCF Ria Services"WebContext.Current.Authentication.LoadUser()",它向服务器发出请求,如果服务器上的用户经过身份验证,则返回当前用户。

这可能有点

晚了,但我遇到了同样的问题,问题出在AsyncServiceClient中。当身份验证失败时,客户端会发送另一个请求,并添加基本身份验证标头。但是,当在此行中创建第二个请求时

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

则未设置 CookieStore,因此在服务器响应时不会存储 Cookie。在上面的行之后,把它放进去:

if (StoreCookies)
{
    requestState.WebRequest.CookieContainer = CookieContainer;
}

最新更新