无法在 ServiceStack 中使用基本身份验证注销用户
Can't logout user with basic authentication in ServiceStack
我目前正在尝试实施 ServiceStack 的身份验证插件,但我在用户登录后注销时遇到问题。我从这个帖子中看到:
How to logout authenticated user in ServiceStack?
您应该能够提出请求 auth/logout
。但是此时我仍然登录。我也尝试以无效用户身份登录 /auth?username=&password=
但无济于事。
奇怪的是,这些方法在极少数情况下对我有用,但我还没有找到原因。任何帮助将不胜感激。
更新:
我刚刚在 Fiddler 中尝试了上述请求并注意到我返回了 401。我想这在尝试以无效用户身份登录时应该是预料之中的,但为什么注销请求会出现这种情况?
看起来这与注销时触发 username/password 验证的情况相同。如果您还没有这样做,可以通过推出自己的 CustomAuthProvider
来解决这个问题。在验证部分,您应该排除注销作为提供者。
public class CustomAuthProvider : CredentialsAuthProvider
{
private class CredentialsAuthValidator : AbstractValidator<Authenticate>
{
public CredentialsAuthValidator()
{
RuleFor(x => x.UserName)
.NotEmpty().WithMessage("Username Required")
.When(d => d.provider != "logout");
RuleFor(x => x.Password)
.NotEmpty().WithMessage("Password Required")
.When(d => d.provider != "logout");
}
}
public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
{
new CredentialsAuthValidator().ValidateAndThrow(request);
return Authenticate(authService, session, request.UserName, request.Password, request.Continue);
}
}
您还需要注册 CustomAuthProvider
Plugins.Add(new AuthFeature(() => new CustomUserSession(),
new IAuthProvider[] {
new CustomAuthProvider()
}) { HtmlRedirect = null });
注意:您缺少 /auth/{provider}?username=&password=
中的提供商
我目前正在尝试实施 ServiceStack 的身份验证插件,但我在用户登录后注销时遇到问题。我从这个帖子中看到:
How to logout authenticated user in ServiceStack?
您应该能够提出请求 auth/logout
。但是此时我仍然登录。我也尝试以无效用户身份登录 /auth?username=&password=
但无济于事。
奇怪的是,这些方法在极少数情况下对我有用,但我还没有找到原因。任何帮助将不胜感激。
更新:
我刚刚在 Fiddler 中尝试了上述请求并注意到我返回了 401。我想这在尝试以无效用户身份登录时应该是预料之中的,但为什么注销请求会出现这种情况?
看起来这与注销时触发 username/password 验证的情况相同。如果您还没有这样做,可以通过推出自己的 CustomAuthProvider
来解决这个问题。在验证部分,您应该排除注销作为提供者。
public class CustomAuthProvider : CredentialsAuthProvider
{
private class CredentialsAuthValidator : AbstractValidator<Authenticate>
{
public CredentialsAuthValidator()
{
RuleFor(x => x.UserName)
.NotEmpty().WithMessage("Username Required")
.When(d => d.provider != "logout");
RuleFor(x => x.Password)
.NotEmpty().WithMessage("Password Required")
.When(d => d.provider != "logout");
}
}
public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
{
new CredentialsAuthValidator().ValidateAndThrow(request);
return Authenticate(authService, session, request.UserName, request.Password, request.Continue);
}
}
您还需要注册 CustomAuthProvider
Plugins.Add(new AuthFeature(() => new CustomUserSession(),
new IAuthProvider[] {
new CustomAuthProvider()
}) { HtmlRedirect = null });
注意:您缺少 /auth/{provider}?username=&password=