在现实世界场景中实现身份服务器身份验证

Posted

技术标签:

【中文标题】在现实世界场景中实现身份服务器身份验证【英文标题】:Implement identity server authentication in real world scenario 【发布时间】:2016-04-19 19:12:33 【问题描述】:

我正在研究 IdentityServer 3 的工作原理,但我仍有问题需要完全理解。

一般概念对我来说很清楚,但我仍然不确定如何在实际项目中实现这一点。

这是我试图在我的案例中实现的基本示例:link

我有 web api 项目,我想从任何客户端(mvc、wpf、电话……)调用我的 api 方法 所以我需要适合所有客户的实现。

如果我理解得很好(可能我没有完全理解),我应该有 3 个项目:

客户 API 托管 IdentityServer 的项目

并且所有项目都应该有图片中所需的东西: 图片上的步骤:

    获取令牌 返回令牌 调用api 检查 Token 是否正常 如果 Token 比返回数据好,否则显示错误

我的问题是:

我认为这是如何工作的好吗? 我哪里出错了? 这个例子对我的情况来说是否足够好?我错过了什么吗 重要吗? 我是否必须创建托管 IdentityServer 的项目,或者这是 只需要示例代码吗? IdentityServer 宿主项目是否必须是控制台应用程序 与 api 和客户端通信(如示例),或在现实世界中 这是不同的做法吗? 应该项目主机身份服务器知道客户端和 用户? 除了主机身份服务器项目之外的其他项目是否应该了解客户端和用户? 隐式流和混合流之间有什么区别,我需要什么以及为什么? 如何创建自己的登录视图?如果我使用 web 客户端,我希望有用于登录的 html 页面,但如果我使用 wpf,我希望有 wpf 登录视图,对于移动客户端也有不同的视图。

编辑: 我认为我需要 Resource Owner flow 。我假设该资源我查看用户输入用户名和密码的位置。

【问题讨论】:

【参考方案1】:

您的基本流程是正确的,身份服务器充当您的授权服务器,而您的客户端和 Web API 是分开的。

您应该在自己的项目中托管 Identity Server,以确保它与可能引入安全问题的任何其他逻辑分开。如何托管它取决于您和您的用例。通常,您会看到它托管在 IIS 服务器上的 ASP.NET 项目中。

Identity Server 必须了解客户端和用户才能对其进行身份验证。唯一应该了解您的身份存储(用户)的其他项目是任何涉及管理、用户注册等内容的应用程序。客户端存储只会被身份服务器使用。

可以使用 Identity Server 模板或通过引入您自己的 ViewService 来修改视图。有关更多信息,请参阅文档:https://identityserver.github.io/Documentation/docsv2/advanced/customizingViews.html

关于流程,资源所有者流程仅是 OAuth,因此不会有身份验证(登录页面),只有授权(服务器到服务器)。

【讨论】:

感谢您的回答。关于登录页面,我仍然不清楚。我计划为相同的 API 提供许多客户端。我将拥有 MVC Web 客户端、WPF Windows 客户端和可能的其他客户端。所以我需要在每个客户端上都有登录页面。如果客户端是 WPF 或手机,通过浏览器登录是没有意义的。这就是我想使用资源所有者流的原因。从客户端发送用户和密码(无论该客户端是什么)。这有意义还是我应该使用不同的方法? 所以我不知道你想说什么“不会有身份验证”?这将是身份验证,因为使用资源所有者流程,您必须发送用户名和密码。仅此用户名和密码将从客户端提供,而不是从身份服务器提供。我说的对吗? 您需要使用 OpenID Connect 流程对您的每个客户端进行身份验证,该流程将允许您登录您的用户,然后获取您的 Web API 的访问令牌(例如混合流程)。然后,此令牌可用于授权使用 OAuth 流(例如客户端凭据或资源所有者)访问 Web API。

以上是关于在现实世界场景中实现身份服务器身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WCF 服务中实现自定义身份验证

如何在 Next.js 中实现身份验证

在 Play Framework 2.x 中实现摘要式身份验证

如何在 node.js 中实现登录身份验证

在 NSwag SwaggerUi 中实现 JwtBearer 身份验证

如何在node.js中实现登录身份验证