gpt4 book ai didi

c# - 从客户端进行身份验证后未保存 ServiceStack session

转载 作者:行者123 更新时间:2023-11-30 23:01:45 26 4
gpt4 key购买 nike

我已经实现了一个自定义身份验证提供程序 (CredentialsAuthProvider) 来对我自己进行身份验证。这里的一切都很完美。我在我的 ASP.NET 客户端应用程序中通过以下代码进行身份验证。

var res = Client.Post(new Authenticate
{
provider = CredentialsAuthProvider.Name,
UserName = "admin",
Password = "topsecret",
RememberMe = true
});

我的自定义 CredentialsAuthProvider 中的 TryAuthenticate 被调用,如果正确我返回 true 并且 IHttpResult OnAuthenticated 之后被调用。完美运行。

然后在我的 OnAuthenticated 方法中设置 session 的某些属性的值。所以我做了这样的事情:

public override IHttpResult OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo)
{
try
{
// Save the browser cookie.
if (authService.Request is IHttpResponse httpRes)
httpRes.Cookies.AddPermanentCookie(HttpHeaders.XUserAuthId, session.UserAuthId);

session.DisplayName = "MyName";
session.IsAuthenticated = true;

// Save the user session object (ServiceStack stores it in the in-memory cache).
authService.SaveSession(session, TimeSpan.FromHours(5));

return base.OnAuthenticated(authService, session, tokens, authInfo);
}
catch (Exception ex)
{
return new HttpResult(HttpStatusCode.ExpectationFailed);
}
}

此外,到目前为止,一切都很完美。现在,如果我想访问需要身份验证的 DTO(在我的示例 Products 中),我仍然得到 Unauthorized。即使我只是验证并保存了我的 session 。

var response = Client.Get(new GetProducts());

我可以看到我的自定义 AuthUserSession 中的方法 IsAuthorized 被调用,但是查看基础 (AuthUserSession) 的属性,我可以看到我之前分配的属性 ( DisplayName、IsAuthorized) 仍具有默认值。 enter image description here

问题:为什么我在 OnAuthenticated 中分配的属性没有被保存?

非常感谢!

编辑:我已经意识到,当我使用它时:

using (JsonServiceClient disposableClient = new JsonServiceClient("http://localhost:24131"))
{
var res = disposableClient.Post(new Authenticate
{
provider = CredentialsAuthProvider.Name,
UserName = "admin",
Password = "topsecret",
RememberMe = true
});

var response = disposableClient.Get(new GetProducts());
}

它可以正常工作,而不是将我的 JsonServiceClient 用作私有(private)类成员。但我不想每次尝试访问资源时都进行身份验证。这种行为的原因是什么?

最佳答案

您的大部分自定义 AuthProvider 都是不必要的,并且已经由 OnAuthenticated() 添加,它添加了 HttpHeaders.XUserAuthId Cookie,设置 IsAuthenticated=true并保存覆盖现有 session 的 session ,因此基本上您的自定义实现应减少为:

public override IHttpResult OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo)
{
session.DisplayName = "MyName";
return base.OnAuthenticated(authService, session, tokens, authInfo);
}

如果您想更改 session 的时长,您可以覆盖 AppHost 中的 OnSaveSession(),只要 session 保存在 ServiceStack 中的任何位置,它就会被调用:

public override void OnSaveSession(IRequest httpReq,IAuthSession session,TimeSpan? expiresIn=null) 
=> base.OnSaveSession(httpReq, session, TimeSpan.FromHours(5));

此外,您不必Dispose() JsonServiceClienthas no effect .所以你的客户端代码就是:

var client = new JsonServiceClient("http://localhost:24131");
var response = client.Post(new Authenticate
{
//Client libs usually don't have access to CredentialsAuthProvider
provider = "credentials",
UserName = "admin",
Password = "topsecret",
RememberMe = true
});

使用 ServiceClient 进行身份验证会填充 Session Cookies在该客户端实例 上,您随后可以使用它来发出经过身份验证的请求:

var response = client.Get(new GetProducts());

请注意 session 是 stored in the registered ICacheClient因此,如果您的 App Domain 重新启动,它将丢失所有 session 。要在应用程序重新启动时保留用户 session ,您可以使用 distributed caching provider (即除内存之外的任何缓存提供程序)或使用 stateless Auth Provider like JWTAPI Key Auth Provider .

如果您收到未经验证的响应并且您的应用程序尚未重新启动(清除内存缓存中存储的所有 session ),请使用 Fiddler 或 WireShark 等数据包/http 嗅探器查看原始 HTTP header 以检查一样Session Cookies are being sent并且经过身份验证的用户 session still exists in the cache在:

urn:iauthsession:{sessionId}

{sessionId} 是您的 ss-pid cookie 的值。

关于c# - 从客户端进行身份验证后未保存 ServiceStack session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50852063/

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