gpt4 book ai didi

rest - 如何使用来自服务堆栈 AuthService 的 cookie/ session 在客户端上加载经过身份验证的用户?

转载 作者:行者123 更新时间:2023-12-02 00:20:38 24 4
gpt4 key购买 nike

我正在使用 Silverlight 5 通过 JsonServiceClient 使用 ServiceStack REST 服务,目前还可以。

此时,我可以在 Asp.Net 中托管的 ServiceStack 中/api 路径上登录/注销。

但是在我登录后,如果用户刷新托管 Silverlight 的浏览器当前页面,Silverlight 应用程序将重新加载并且 session /cookie 信息消失,迫使用户再次登录/密码。这是一种不良行为。

在服务器端,我使用默认的 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/ session ??

编辑

经过一段时间检查 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 设置到浏览器。

好的,现在我们可以使用 cookie,因为我确定它们是从客户端发送到浏览器的。

那么,如何在不重新发送用户名和密码的情况下,基于已有的 X-UAId 对用户进行重新认证呢?

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

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

最佳答案

这可能有点晚了,但我遇到了同样的问题,而且问题出在 AsyncServiceClient 中。当身份验证失败时,客户端发送另一个添加了 BasicAuthentication header 的请求。然而,当第二个请求在这一行中创建时

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

然后 CookieStore 未设置,因此当服务器响应时不会存储 cookie。在上面一行之后,把这个放在:

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

关于rest - 如何使用来自服务堆栈 AuthService 的 cookie/ session 在客户端上加载经过身份验证的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11086883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com