在ServiceStack v4上注销

时间:2014-01-28 11:39:41

标签: servicestack

我有ServiceStack v4服务但是当我调用auth/logout路由(使用POSTGET)注销当前登录的用户时,我收到错误:

  

400不空     用户名不能为空     密码不能为空

由于我不希望用户在退出时输入凭据,我肯定错过了什么?

我在主机初始化期间注册了AuthFeature,我正在使用CredentialsAuthProvider。我从Github那里获取了代码,所以我可以看到它是如何工作的。

我的客户代码:

var rest = Restangular.one('auth/logout').get(); 
//var result = rest.post({userName: userName}); 
this.requestTracker.addPromise(rest); 
return rest;

2 个答案:

答案 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函数并使用上面提到的验证程序的修改版本。