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

14

我正在研究IdentityServer 3的工作原理,但我仍然有些不理解。

总体概念对我来说是清楚的,但我仍然不确定如何在实际项目中实现它。

这是我正在尝试实现的基本示例:链接

我有一个Web API项目,我想从任何客户端(mvc,wpf,phone…)调用我的API方法。因此,我需要适用于所有客户端的实现。

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

  • 客户端
  • API
  • 托管IdentityServer的项目

所有项目都应具有像图片上所示的所需内容:

enter image description here

图片步骤:

  1. 获取令牌
  2. 返回令牌
  3. 调用API
  4. 检查令牌是否正确
  5. 如果令牌正常,则返回数据;否则显示错误

我的问题是:

  • 我的思路正确吗?
  • 我在哪里犯了错误?
  • 这个示例对于我的情况是否足够好?我是否遗漏了重要信息?
  • 我必须创建托管IdentityServer的项目,还是这只是为了示例代码而需要?
  • IdentityServer托管项目必须是与API和客户端通信的控制台应用程序(如示例中所示),还是在实际世界中会以不同方式完成?
  • 托管身份验证服务器项目是否应该知道客户端和用户?
  • 除了托管身份验证服务器项目之外,是否应该有其他项目知道客户端和用户?
  • 隐式流和混合流之间有什么区别,我在我的情况下需要什么以及为什么?
  • 如何创建自己的登录视图?如果使用Web客户端,则需要HTML页面进行登录,但如果使用WPF,则需要WPF登录视图,并且对于移动客户端需要不同的视图。
  • 编辑:我认为我需要资源所有者流程(Resource Owner flow)。我假设资源是用户输入用户名和密码的视图。

    1个回答

    3
    您的基本流程是正确的,Identity Server作为您的授权服务器,客户端和Web API分离。您应该将Identity Server托管在自己的项目中,以确保它与可能引入安全问题的任何其他逻辑分开。如何托管它取决于您的用例。通常,您会在IIS服务器上的ASP.NET项目中托管它。
    Identity Server必须知道客户端和用户才能对其进行身份验证。唯一需要知道您身份存储(用户)的其他项目是涉及管理员、用户注册等事项的任何应用程序。客户端存储只能由Identity Server使用。
    可以使用Identity Server模板或引入自己的ViewService来修改视图。有关更多信息,请参见文档:https://identityserver.github.io/Documentation/docsv2/advanced/customizingViews.html 关于流程,资源所有者流程仅限于OAuth,因此不会进行身份验证(登录页面),只会进行授权(服务器对服务器)。

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接