【问题标题】:How to create an identityuser by just having the user type in a password in the client-app如何通过让用户在客户端应用程序中输入密码来创建身份用户
【发布时间】:2019-12-16 19:32:51
【问题描述】:

使用 identityserver 4 时,我的 Web 应用程序是否可以通过让用户在客户端应用程序中输入密码来创建身份用户?

在我的网络应用程序中,用户将填写一些关于他自己的详细信息,例如姓名、电子邮件和地址(用于购物车),并且在销售完成后,我希望让用户根据这些信息创建一个身份他刚刚给了。

例如,一个文本框说

Thank you for your order, 
if you want to keep a history of your transactions, 
please type in the password you want to use here: 

然后在用户按下按钮后,将在幕后生成一个身份用户,并将用户重定向到他的新个人资料。

到目前为止,我只能看到我必须将用户发送到身份服务器进行用户注册,所以希望这里有更好的消息 :)

提前致谢。

【问题讨论】:

    标签: c# asp.net-mvc identityserver4


    【解决方案1】:

    使用身份服务器 4 时,我的网络应用程序是否可以创建 一个身份用户,只需让用户在 客户端应用程序?

    答案是否定的。

    这不是因为技术问题,而是因为安全问题。

    最小权限原则禁止客户端请求用户凭据。这就是用户需要登录 IdentityServer 网站的原因。客户端无权访问用户的凭据。身份验证外包给 IdentityServer。

    当您选择 IdentityServer4 时,您选择的是 OpenIdConnect,而不是会员系统。 Oidc 是指所有客户一个账户。这就是另一个问题所在:客户端不拥有用户。客户和用户之间没有任何关系。

    因此,任何用户在通过身份验证后都可以使用任何客户端。用户授权必须限制用户的访问。

    用户可能已经有一个帐户,用于另一个应用程序。因此,用户可能希望使用该帐户登录,而不是创建另一个帐户。

    客户端中唯一支持用户登录的流程是资源所有者密码流程。虽然它可能仍会实施,但出于安全原因,它是 not recommended,不再是 documented 作为可用的授权类型。


    如果您不是在寻找 oidc 和 SSO,那么您可能希望将 Identity 实现为会员系统,其中应用程序拥有自己的用户存储。在那种情况下,我不会使用 IdentityServer。

    否则,您可以将用户发送到 IdentityServer 网站并允许用户登录或创建帐户。您可以通过查看 client_id 来自定义视图以获得良好的用户体验。

    请注意,用户只需要一个帐户即可登录。您应该将用户信息保留在数据库中,因为那是它所属的地方。它是业务上下文的一部分,与帐户无关。

    帐户是附加功能,只需要从业务用户到身份用户的链接。

    【讨论】:

      【解决方案2】:

      创建一个接受您描述的用户数据并从中生成用户的端点。 See here

      示例,以防链接损坏

      ApplicationDbContext context = new ApplicationDbContext();
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
      var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
      UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager)
      {
          AllowOnlyAlphanumericUserNames = false,
          RequireUniqueEmail = true
      };
      
      var user = new ApplicationUser();
      user.Email = model.Email;
      user.UserName = model.Username;
      var result = UserManager.Create(user, model.Password);
      

      我建议您发送注册邮件,用户必须确认才能使用创建的帐户。在给定时间后未确认的生成用户应被删除。

      另外,考虑在发送到端点时加密密码。

      【讨论】:

        猜你喜欢
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-10
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多