【问题标题】:IdentityServer 4 confused on how it all worksIdentityServer 4 对它的工作原理感到困惑
【发布时间】:2018-09-17 00:10:22
【问题描述】:

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

我现在知道它是一个单独的项目,它负责对用户进行身份验证。我仍然不明白用户如何注册它?谁存储用户名/密码?

我打算进行此设置

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

那么它会起作用吗?到目前为止,我看到的所有视频都在谈论如何在内存用户中进行测试,但他们从未谈论过注册它。

我看过一些视频,他们有一个现有的数据库,然后将其连接到 Identity Server 4 并检查该数据库。然而,当你注册新人时,他们不会谈论你是否从头开始,甚至在他们的场景中。

编辑

Camilo Terevinto 提出了使用“ASP.NET Core Identity”的观点,我一直在研究它并有一些问题。

我现在对这个的理解是这样的

  1. 一个用户来到我的 reactjs 站点并想要登录
  2. 被发送到 Identity Server 4 (IS4) 并输入凭据
  3. IS4 查看包含 ASP.NET Core 标识表的数据库并验证用户
  4. 如果一切正常,它会转到 IS4 表并添加所需的任何内容。
  5. 发回用户和令牌。
  6. 现在 Reactjs 可以访问我的 web api 并从中获取其他数据。

我的问题是如果用户正在注册会发生什么。

  1. 一个用户来到我的 reactjs 网站并想要注册

  2. 用户查看我的 html/reactjs 表单并填写

  3. 信息被发送到 webapi 并存储在 ASP.NET Core 身份表中

  4. 现在,我必须将用户发送到我现在必须登录的 IS4 吗?这似乎很糟糕。

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

【问题讨论】:

  • 你是对的,IdentityServer 一开始可能有点压倒性。请记住,重要的是提供分离,这样您的应用程序就不必依赖任何特定的身份验证机制。同时,您将采用一些标准,让您的应用程序与不同的提供商(联合身份)一起工作。 IdentityServer 具有高度可扩展性,提供本地身份验证机制(在其自己的密码数据库中 - 内存中或持久化)和外部身份验证机制(在另一个身份提供者处 -​​ 如 Google 或 ADFS)。你的技术栈对我来说似乎很明智
  • 最好阅读官方文档而不是观看视频。例如,这里是描述如何使用 Entity Framework 配置它的快速入门(它可以与许多不同的数据库一起使用):docs.identityserver.io/en/dev/quickstarts/…
  • @Evk 是的,这就是我现在正在研究的内容,将它们作为我的下一步,但不知道为什么,但我得到了我的 Identity Server 项目和一个 web api 项目,但每次我放一个授权标签打开,页面是404而不是401,没有它的标签。
  • 页面是 404 而不是 401 - 检查获取 404 时应用程序尝试调用的 url 是什么。通常这是因为当身份验证失败时 ASP.NET 尝试重定向到不退出的默认 url - 这就是为什么你得到 404

标签: c# asp.net-core identityserver4


【解决方案1】:

谁存储用户名/密码?

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

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

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

ASP.NET Core Identity 是 Microsoft 提供的可选 ASP.NET Core 成员库,允许您使用内部(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 表并添加所需的任何内容。

这一步不会发生。如果一切正常,IS4 会生成令牌并返回它。

  1. 发回用户和令牌。

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

请记住,ASP.NET Core Identity 将托管在与 IS4 相同的应用程序中,并且它们可以轻松(如果需要)共享相同的数据库。

对于第二个流程,如果 Identity 与 IS4 在同一个应用程序中,则很容易让用户登录(事实上,这很常见)。如果它们是分开的,你可能不得不让 React 应用程序像往常一样调用 IS4。


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

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

如您所见,Identity 用作 IS4 的存储。身份创建和维护数据,IS4 使用它。


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

永远记住,每个想要联系您的 IS4 的应用程序都需要在 IS4 数据库中注册为客户端,并且需要启用它。如果应用程序使用来自不同于存储在数据库中的 URL 的 ClientId,则当 ClientId 被泄露或为公众所知时,请求将被拒绝以增强安全性,JavaScript Web 客户端就是这种情况。

【讨论】:

猜你喜欢
  • 2021-06-24
  • 2011-08-25
  • 2015-01-13
  • 2023-04-08
  • 1970-01-01
  • 2011-10-13
  • 2015-11-12
  • 2012-08-24
  • 2019-03-18
相关资源
最近更新 更多