我有ServiceStack v4服务但是当我调用auth/logout
路由(使用POST
或GET
)注销当前登录的用户时,我收到错误:
400不空 用户名不能为空 密码不能为空
由于我不希望用户在退出时输入凭据,我肯定错过了什么?
我在主机初始化期间注册了AuthFeature
,我正在使用CredentialsAuthProvider
。我从Github那里获取了代码,所以我可以看到它是如何工作的。
我的客户代码:
var rest = Restangular.one('auth/logout').get();
//var result = rest.post({userName: userName});
this.requestTracker.addPromise(rest);
return rest;
答案 0 :(得分:0)
经过大量挖掘后,当您使用CredentialsAuthProvider时会发生这种情况。在此类中,定义了验证器,用于验证Authenticate请求的所有实例。当注销路由使用Authenticate请求时,将触发此验证程序。
我通过将验证器修改为:
来解决它RuleFor(x => x.UserName).NotEmpty().When(d => d.provider != "logout");
RuleFor(x => x.Password).NotEmpty().When(d => d.provider != "logout");
这可能不是长期修复的最优雅方式,但让我开始运作。
答案 1 :(得分:0)
我知道这个问题很老,但我最近一直在努力解决同样的问题。发生的情况是,在调用Authenticate.Post函数之前,将检查验证缓存,并且具有上述验证器的CredentialsAuthProvider将失败,除非用户名和密码不为空。
现在,如果您只启用了该提供商,我不确定它是否有所作为 - 我还没有测试过。我实际上有自己的自定义提供程序,它是CredentialsAuthProvider的子类,它是我注册的唯一一个。
目前唯一的方法是传递非空(但无用)的密码和用户名,或者修改自己的自定义提供程序,覆盖Authenticate函数并使用上面提到的验证程序的修改版本。