IdentityServer 4对它的运作方式感到困惑

时间:2018-04-06 22:15:57

标签: c# asp.net-core identityserver4

我一直在阅读和观看很多有关Identity Server 4的内容,我仍然对此感到困惑,因为似乎有很多活动部分。

我现在明白它是一个单独的项目,它处理用户身份验证。我还没有得到的是用户如何注册?谁存储用户名/密码?

我计划进行此设置

Reactjs front end 
Asp.net Web Api Core 2
Identity Server

它会起作用吗?到目前为止,我看到的所有视频都谈到了在内存用户中做了什么测试,但他们从不谈论注册它。

我看到一些视频,他们有一个现有的数据库,然后将它与Identity Server 4挂钩,然后检查该数据库。然而,他们不会谈论你的新手,甚至在他们签约新人的情况下。

修改

Camilo Terevinto提出了使用" ASP.NET核心身份"我一直在调查并提出一些问题。

我对此的理解就像这样

enter image description here

  1. 用户来到我的reactjs网站并希望登录
  2. 获取发送到Identity Server 4(IS4)并输入凭据
  3. IS4查看包含ASP.NET核心标识表的数据库并验证用户
  4. 如果一切都好,那么它会转到IS4表并添加它需要的任何内容。
  5. 发送回用户和令牌。
  6. 现在Reactjs可以点击我的网络API并从中获取其他数据。
  7. 我的问题是如果用户正在注册会发生什么。

    enter image description here

    1. 用户来到我的reactjs网站并希望注册
    2. 用户查看我的html / reactjs表单并填写
    3. 信息将发送到webapi并存储在ASP.NET核心标识表中
    4. 现在,我必须将用户发送到他们现在必须登录的IS4吗?这看起来很糟糕。

      同样在这种情况下,什么会阻止某人通过注册向我的api发送垃圾邮件,因为它是一个开放的终点。

1 个答案:

答案 0 :(得分:2)

  

谁存储用户名/密码?

Identity Server的美妙之处在于它并不关心。您可以使用数据库,文本文件或Active Directory。您有责任选择最适合您的用例。

IMO,使用ASP.NET核心身份来管理用户的CRUD(Identity Server已经提供了绑定,您可以看到它们在演示中的完成情况)是最简单的方法。如果您之前使用过ASP.NET身份,那么您需要添加的只是

services.AddIdentityServer().AddAspNetIdentity<YourUserClass>();

ASP.NET Core Identity是Microsoft的可选ASP.NET核心成员资格库,允许您使用内部(Windows,数据库)方法和外部(OAuth / OpenId Connect - Faceboook,Google,Microsoft帐户)注册和登录用户等系统。 Microsoft在Microsoft Docs站点look here for an introduction中提供了大量信息 在这种情况下,请将ASP.NET Core Identity视为提供用户,角色和声明的Identity Server信息的媒介。您可以通过Identity创建用户,但实际的身份验证和授权由Identity Server完成。

您可以为您的React应用程序公开REST端点,以便能够注册(并可能修改?)您的用户及其角色。对于登录,理想的方法是使React应用程序通过隐式流程与Identity Server联系。

然而,问问自己,您的方案中是否需要Identity Server。如果该Identity Server保护的唯一应用程序是React应用程序,那么很可能是浪费,您可以自己使用ASP.NET Core Identity。

关于你的编辑,第一个流程几乎没问题,但是:

  
      
  1. 如果一切都好,那么它会转到IS4表并添加它需要的任何内容。
  2.   

此步骤不会发生。如果一切正常,IS4会生成令牌并将其返回。

  
      
  1. 发送回用户和令牌。
  2.   

IS4,与任何OAuth 2.0或OpenID Connect解决方案一样,仅将生成的令牌返回给客户端。但令牌本身包含有关用户的信息。

请记住,ASP.NET核心标识将与IS4在同一个应用程序中托管,并且可以轻松地(如果需要)共享同一个数据库。

对于第二个流程,如果Identity与IS4在同一个应用程序中,则很容易记录用户(事实上,这很常见)。如果它们是分开的,您可能必须使React应用程序正常调用IS4。

我说你可以在Identity和IS4上使用相同的数据库,因为至少对我来说,将所有安全性内容(应用程序和用户)放在一起是有意义的。

用户信息由“用户”表中的“身份”提供,其“个人资料”数据可以存储为声明(同样,使用“身份”来保存它们),并将其授权信息存储为“声明”或“角色”。 IS4会将用户的所有角色映射到单个“角色”声明中,因此您可以选择它。

如您所见,Identity充当IS4的商店。身份创建并维护数据,IS4使用它。

关于登录/注册过程,在IS4应用程序中使用这些过程是很常见的,这样所有客户端都可以使用相同的视图,并且用户可以跨应用程序获得相同的UX。如果需要,甚至可以根据客户端ID为登录/注册提供不同的视图。

永远记住,每个想要联系IS4的应用程序都需要作为客户端在IS4数据库中注册,并且需要启用它。如果应用程序使用不同于存储在数据库中的URL的ClientId,则拒绝该请求以在ClientId被泄露或公开时增强安全性,就像JavaScript Web客户端一样。