如何在ServiceStack

时间:2017-09-13 20:32:32

标签: servicestack registration

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

  1. 允许用户创建新帐户
  2. 验证用户名和/或电子邮件是否已在使用中
  3. 注册后自动登录用户
  4. 返回带回复的JWT令牌
  5. 我目前正在使用位于here的RegisterService来处理所有用户注册逻辑。

    问题似乎是在用户注册之后,任何其他用户都可以使用相同的用户名和/或电子邮件注册,而它所做的就是更新以前的用户数据。我注意到,当我重新启动API时,行:

    RegistrationValidator?.ValidateAndThrow(request,registerNewUser?ApplyTo.Post:ApplyTo.Put);

    如果用户名或电子邮件已存在,

    将抛出错误。但是,正如我刚刚在新用户注册时所解释的那样,他们之后的另一个用户可以使用完全相同的信息,它所做的就是在用户之前更新用户。这不是理想的结果。

    为什么验证在重新启动API时似乎有效,但在运行时却没有?

    当我逐步完成代码时,我注意到this.GetSession()似乎返回一个新的会话,基本上所有的东西在首次启动时都设置为null,但是一旦用户登录或注册,GetSessions()就会返回最近的用户会话。

    我提前道歉,如果我离开就像我什么都不知道,就像我说我对ServiceStack很新,​​我过去几天都在努力解决这个问题。我已经搜索了许多论坛,包括ServicStacks客户论坛甚至在这里。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

问题似乎是在用户注册之后,任何其他用户都可以使用相同的用户名和/或电子邮件注册,而它所做的就是更新以前的用户数据。

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

client.Post(new Authenticate { provider = "logout" });
  

如果我重新启动API,为什么验证似乎有效,但不是   它正在运行?

由于用户已通过身份验证,并且您正在使用默认的内存缓存客户端Sessions are saved to,并且重新启动应用程序域会清除所有用户会话,因此之前所有已通过身份验证的用户都未经身份验证。

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

注册然后验证用户

  1. 使用注册服务创建新帐户。如果正在使用用户名或电子邮件,注册服务将抛出。

  2. 注册成功后,请致电Authenticate服务(/auth/credentials)以使用新凭据对用户进行身份验证。如果注册JWT AuthProvider并使用https调用它,或者JWT Auth Provider配置了RequireSecureConnection=false,它将返回JWT令牌和刷新令牌。

  3. 如果您Authenticate with UseTokenCookie=true,则Authenticated UserSession将转换为JWT令牌,并在ss-tok Cookie中返回。

    使用AutoLogin注册用户,然后将会话转换为令牌

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

    使用最新版本

    向AutoLogin注册用户

    我刚刚在this commitAutoLogin注册请求中添加了返回JWT令牌和刷新令牌的支持,因此您只需注册用户:

    var response = client.Post(new Register {
        //...
        AutoLogin = true
    });
    

    您将能够访问JWT令牌:

    response.BearerToken   //JWT Token
    response.RefreshToken  //JWT RefreshToken
    

    此更改可从v4.5.15获取,现在为available on MyGet