如何在 ServiceStack 中正确使用用户注册

How to properly use user registration in ServiceStack

我是 ServiceStack 的新手,我在真正理解用户注册方面遇到了一些问题。我们的目标是:

  • 允许用户创建新帐户
  • 验证用户名和/或电子邮件是否已在使用中
  • 用户注册后自动登录
  • 返回带有响应的 JWT 令牌
  • 我目前正在使用位于此处的 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.

    只有当前用户可以在注册后更新他们的用户注册信息。您可以通过调用 /auth/logout 清除他们的会话或使用服务客户端返回为未经身份验证的用户:

    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?

    因为用户已通过身份验证,并且您正在使用默认的内存缓存客户端,其中保存了会话并重新启动应用程序域会清除所有用户会话,因此所有以前经过身份验证的会话现在都未经身份验证。

    有几种不同的选择可以实现您想要的结果:

    注册然后验证用户

  • 使用注册服务创建一个新帐户。如果用户名或电子邮件正在使用中,注册服务将抛出异常。

  • 成功注册后,调用 Authenticate 服务 (/auth/credentials) 以使用新凭据对用户进行身份验证。如果 JWT AuthProvider 已注册并使用 https 调用它或 JWT Auth Provider 配置了 RequireSecureConnection=false 它将返回 JWT Token 和 Refresh Token。

  • 如果您使用 UseTokenCookie=true 进行身份验证,则经过身份验证的 UserSession 将转换为 JWT 令牌并在 ss-tok Cookie 中返回。

    使用 AutoLogin 注册用户,然后将 Session 转换为 Token

    使用注册服务自动登录,使用AutoLogin=true调用Register服务将在同一个请求中注册用户后对用户进行身份验证,但注册服务返回的RegisterResponse DTO不包含JWT令牌,您可以改为调用 /session-to-token 将当前经过身份验证的用户会话转换为 JWT 令牌,该令牌在 ss-tok Cookie 中返回,该 Cookie 与后续请求一起发送以进行经过身份验证的请求。

    使用最新版本的 AutoLogin 注册用户

    我刚刚在此提交中添加了对在 AutoLogin 注册请求中返回 JWT 令牌和刷新令牌的支持,因此您可以通过以下方式注册用户:

    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 上使用。