我已经实现了一个自定义身份验证提供程序 (CredentialsAuthProvider) 来对自己进行身份验证。一切都在这里完美。我通过我的 ASP.NET 客户端应用程序中的以下代码进行身份验证。
var res = Client.Post(new Authenticate
{
provider = CredentialsAuthProvider.Name,
UserName = "admin",
Password = "topsecret",
RememberMe = true
});
我的自定义 CredentialsAuthProvider 中的 TryAuthenticate 被调用,如果正确,我返回 true,然后IHttpResult OnAuthenticated被调用。完美运行。
然后在我的OnAuthenticated方法中设置会话的某些属性的值。所以我做这样的事情:
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. 即使我只是验证并保存了我的会话。
var response = Client.Get(new GetProducts());
我可以看到我的IsAuthorized自定义 AuthUserSession 中的方法被调用,但是查看基础 (AuthUserSession) 的属性,我可以看到我之前分配的属性 (DisplayName, IsAuthorized) 仍然具有它们的默认值。
问题:为什么我分配的属性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 作为私有类成员,而是工作。但是我不想每次尝试访问资源时都进行身份验证。这种行为的原因是什么?