How to properly use user registration in ServiceStack
我是 ServiceStack 的新手,我在真正理解用户注册方面遇到了一些问题。我们的目标是:
我目前正在使用位于此处的 RegisterService 来处理我们所有的用户注册逻辑。
问题似乎在于,在用户注册后,任何其他用户都可以使用相同的用户名和/或电子邮件进行注册,而它所做的只是更新以前的用户数据。我注意到,当我重新启动 API 时,该行:
RegistrationValidator?.ValidateAndThrow(request, registerNewUser ? ApplyTo.Post : ApplyTo.Put);
如果用户名或电子邮件已经存在,
会抛出错误。但是,正如我刚刚解释的那样,一旦新用户注册,紧随其后的另一个用户可以使用完全相同的信息,它所做的只是更新之前的用户。这不是预期的结果。
为什么如果我重新启动 API,验证似乎有效,但在它运行时无效?
当我单步执行代码时,我注意到 this.GetSession() 似乎返回了一个新会话,在 API 首次启动时基本上所有内容都设置为 null,但是一旦用户登录或注册 GetSessions() 就会返回最近的用户会话。
如果我表现得好像我什么都不知道一样,我提前道歉,就像我说我对 ServiceStack 很陌生,而且我在过去的几天里一直在努力解决这个问题。我搜索了许多论坛,包括 ServicStacks 客户论坛,甚至这里。任何建议将不胜感激!
The problem seems to be that after a user registers any other user can register with the same user name and/or email and all it does is updates the previous users data.
只有当前用户可以在注册后更新他们的用户注册信息。您可以通过调用
1 | client.Post(new Authenticate { provider ="logout" }); |
Why does the validation seem to work if I restart the API, but not
while it is running?
因为用户已通过身份验证,并且您正在使用默认的内存缓存客户端,其中保存了会话并重新启动应用程序域会清除所有用户会话,因此所有以前经过身份验证的会话现在都未经身份验证。
有几种不同的选择可以实现您想要的结果:
注册然后验证用户
使用注册服务创建一个新帐户。如果用户名或电子邮件正在使用中,注册服务将抛出异常。
成功注册后,调用
如果您使用 UseTokenCookie=true 进行身份验证,则经过身份验证的 UserSession 将转换为 JWT 令牌并在
使用 AutoLogin 注册用户,然后将 Session 转换为 Token
使用注册服务自动登录,使用
使用最新版本的 AutoLogin 注册用户
我刚刚在此提交中添加了对在
1 2 3 4 | var response = client.Post(new Register { //... AutoLogin = true }); |
您将能够在以下位置访问 JWT 令牌:
1 2 | response.BearerToken //JWT Token response.RefreshToken //JWT RefreshToken |
此更改从 v4.5.15 开始可用,现在可在 MyGet 上使用。