我是ServiceStack的新手,我遇到了一些真正理解用户注册内容的问题。我们的目标是:
我目前正在使用位于here的RegisterService来处理所有用户注册逻辑。
问题似乎是在用户注册之后,任何其他用户都可以使用相同的用户名和/或电子邮件注册,而它所做的就是更新以前的用户数据。我注意到,当我重新启动API时,行:
RegistrationValidator?.ValidateAndThrow(request,registerNewUser?ApplyTo.Post:ApplyTo.Put);
如果用户名或电子邮件已存在,将抛出错误。但是,正如我刚刚在新用户注册时所解释的那样,他们之后的另一个用户可以使用完全相同的信息,它所做的就是在用户之前更新用户。这不是理想的结果。
为什么验证在重新启动API时似乎有效,但在运行时却没有?
当我逐步完成代码时,我注意到this.GetSession()似乎返回一个新的会话,基本上所有的东西在首次启动时都设置为null,但是一旦用户登录或注册,GetSessions()就会返回最近的用户会话。
我提前道歉,如果我离开就像我什么都不知道,就像我说我对ServiceStack很新,我过去几天都在努力解决这个问题。我已经搜索了许多论坛,包括ServicStacks客户论坛甚至在这里。任何建议将不胜感激!
答案 0 :(得分:1)
问题似乎是在用户注册之后,任何其他用户都可以使用相同的用户名和/或电子邮件注册,而它所做的就是更新以前的用户数据。
只有当前用户在注册后才能更新用户注册信息。您可以通过调用/auth/logout
来清除其会话或使用服务客户端来恢复为未经身份验证的用户:
client.Post(new Authenticate { provider = "logout" });
如果我重新启动API,为什么验证似乎有效,但不是 它正在运行?
由于用户已通过身份验证,并且您正在使用默认的内存缓存客户端Sessions are saved to,并且重新启动应用程序域会清除所有用户会话,因此之前所有已通过身份验证的用户都未经身份验证。
有几种不同的选择可以实现您期望的结果:
使用注册服务创建新帐户。如果正在使用用户名或电子邮件,注册服务将抛出。
注册成功后,请致电Authenticate
服务(/auth/credentials
)以使用新凭据对用户进行身份验证。如果注册JWT AuthProvider并使用https
调用它,或者JWT Auth Provider配置了RequireSecureConnection=false
,它将返回JWT令牌和刷新令牌。
如果您Authenticate with UseTokenCookie=true,则Authenticated UserSession将转换为JWT令牌,并在ss-tok
Cookie中返回。
使用注册服务自动登录,使用Register
调用AutoLogin=true
服务将在同一请求中注册后对用户进行身份验证,但注册服务返回的RegisterResponse
DTO不会不包含JWT令牌,而是可以call /session-to-token将当前经过身份验证的用户会话转换为在ss-tok
Cookie中返回的JWT令牌,该令牌随后发出请求以进行经过身份验证的请求。
我刚刚在this commit的AutoLogin
注册请求中添加了返回JWT令牌和刷新令牌的支持,因此您只需注册用户:
var response = client.Post(new Register {
//...
AutoLogin = true
});
您将能够访问JWT令牌:
response.BearerToken //JWT Token
response.RefreshToken //JWT RefreshToken
此更改可从v4.5.15获取,现在为available on MyGet。