当前位置: 移动技术网 > IT编程>开发语言>.net > IdentityServer4中文文档

IdentityServer4中文文档

2018年11月10日  | 移动技术网IT编程  | 我要评论

砗磲是什么,封神榜 陈浩民国语,少年行窃捆绑示众

欢迎identityserver4

identityserver4是asp.net core 2的openid connect和oauth 2.0框架。

它在您的应用程序中启用以下功能:

认证即服务

适用于所有应用程序(web,本机,移动设备,服务)的集中登录逻辑和工作流程。identityserver是openid connect 的官方实现。

单点登录/注销

在多种应用程序类型上单点登录(和退出)。

api的访问控制

为各种类型的客户端发出api访问令牌,例如服务器到服务器,web应用程序,spa和本机/移动应用程序。

联合网关

支持azure active directory,google,facebook等外部身份提供商。这可以保护您的应用程序免受如何连接到这些外部提供商的详细信息的影响。

专注于定制

最重要的部分 - identityserver的许多方面都可以根据您的需求进行定制。由于identityserver是一个框架而不是盒装产品或saas,因此您可以编写代码以使系统适应您的方案。

成熟的开源

identityserver使用允许的apache 2许可证,允许在其上构建商业产品。它也是.net foundation的一部分,它提供治理和法律支持。

免费和商业支持

如果您需要帮助构建或运行您的身份平台,请。我们可以通过多种方式为您提供帮助。

大图

大多数现代应用程序或多或少看起来像这样:

 

 

最常见的互动是:

  • 浏览器与web应用程序通信

  • web应用程序与web api进行通信(有时是自己的,有时是代表用户)

  • 基于浏览器的应用程序与web api通信

  • 本机应用程序与web api通信

  • 基于服务器的应用程序与web api通信

  • web api与web api进行通信(有时是自己的,有时是代表用户)

通常,每个层(前端,中间层和后端)都必须保护资源并实现身份验证和/或授权 - 通常针对同一个用户存储。

将这些基本安全功能外包给安全令牌服务可防止在这些应用程序和端点之间复制该功能。

重构应用程序以支持安全令牌服务会产生以下体系结构和协议:

 

这种设计将安全问题分为两部分:

认证

当应用程序需要知道当前用户的身份时,需要进行身份验证。通常,这些应用程序代表该用户管理数据,并且需要确保该用户只能访问允许的数据。最常见的例子是(经典)web应用程序 - 但是基于本机和js的应用程序也需要身份验证。

最常见的身份验证协议是saml2p,ws-federation和openid connect - saml2p是最受欢迎和最广泛部署的。

openid connect是三者中的最新产品,但被认为是未来,因为它具有最大的现代应用潜力。它是从一开始就为移动应用场景而构建的,旨在实现api友好。

api访问

应用程序有两种与api通信的基本方式 - 使用应用程序标识或委派用户的标识。有时两种方法都需要结合起来。

oauth2是一种协议,允许应用程序从安全令牌服务请求访问令牌并使用它们与api通信。此委派降低了客户端应用程序和api的复杂性,因为身份验证和授权可以集中。

openid connect和oauth 2.0 - 更好地结合在一起

openid connect和oauth 2.0非常相似 - 事实上,openid connect是oauth 2.0之上的扩展。两个基本的安全问题,即身份验证和api访问,被合并为一个协议 - 通常只需要一次往返安全令牌服务。

我们相信,openid connect和oauth 2.0的结合是在可预见的未来保护现代应用程序的最佳方法。identityserver4是这两种协议的实现,经过高度优化,可以解决当今移动,本机和web应用程序的典型安全问题。

identityserver4如何提供帮助

identityserver是一个中间件,可将符合规范的openid connect和oauth 2.0端点添加到任意asp.net core应用程序中。

通常,您构建(或重用)包含登录和注销页面的应用程序(并且可能同意 - 取决于您的需要),identityserver中间件为其添加必要的协议头,以便客户端应用程序可以与之通信使用那些标准协议。

托管应用程序可以像您想要的那样复杂,但我们通常建议通过仅包含与身份验证相关的ui来使攻击面尽可能小。

术语

规范,文档和对象模型使用您应该注意的某些术语。

 

identityserver

identityserver是openid connect提供程序 - 它实现openid connect和oauth 2.0协议。

不同的文献对同一个角色使用不同的术语 - 您可能还会找到安全令牌服务,身份提供者,授权服务器,ip-sts等。

但它们完全相同:一种向客户发放安全令牌的软件。

identityserver具有许多作业和功能 - 包括:

  • 保护你的资源

  • 使用本地帐户存储或外部身份提供程序对用户进行身份验证

  • 提供会话管理和单点登录

  • 管理和验证客户端

  • 向客户发放身份和访问令牌

  • 验证令牌

用户

用户是使用注册客户端访问资源的人。

客户

客户端是从identityserver请求令牌的软件 - 用于验证用户(请求身份令牌)或访问资源(请求访问令牌)。客户端必须首先向identityserver注册,然后才能请求令牌。

客户端的示例包括web应用程序,本机移动或桌面应用程序,spa,服务器进程等。

资源

您希望使用identityserver保护资源 - 用户的身份数据或api。

每个资源都有一个唯一的名称 - 客户端使用此名称来指定他们希望访问哪些资源。

身份数据 关于用户的身份信息(也称为声明),例如姓名或电子邮件地址。

api api资源表示客户端要调用的功能 - 通常建模为web api,但不一定。

身份令牌

身份令牌表示身份验证过程的结果。它至少包含用户的标识符(称为sub aka subject声明)以及有关用户如何以及何时进行身份验证的信息。它可以包含其他身份数据。

访问令牌

访问令牌允许访问api资源。客户端请求访问令牌并将其转发给api。访问令牌包含有关客户端和用户(如果存在)的信息。api使用该信息来授权访问其数据。

支持的规格

identityserver实现以下规范:

id连接

  • openid connect core 1.0(

  • openid connect discovery 1.0(

  • openid connect会话管理1.0 - 草案28(

  • openid connect front-channel logout 1.0 - 草案02(

  • openid connect back-channel logout 1.0 - 草案04(

oauth 2.0用户

  • oauth 2.0(

  • oauth 2.0承载令牌使用(

  • oauth 2.0多种响应类型(

  • oauth 2.0表单后期响应模式(

  • oauth 2.0令牌撤销(rfc 7009

  • oauth 2.0令牌自省(rfc 7662

  • 代码交换的证明密钥(rfc 7636

  • 用于客户端身份验证的json web令牌(rfc 7523

打包和构建

identityserver由许多nuget包组成。

identityserver4

nuget | github上

包含核心identityserver对象模型,服务和中间件。仅包含对内存配置和用户存储的支持 - 但您可以通过配置插入对其他存储的支持。这是其他回购和包装的内容。

快速入门

github上

包含一个简单的入门ui,包括登录,注销和同意页面。

访问令牌验证处理程序

nuget | github上

用于验证api中令牌的asp.net core身份验证处理程序。处理程序允许在同一api中支持jwt和引用令牌。

asp.net核心标识

nuget | github上

identityserver的asp.net核心身份集成包。该软件包提供了一个简单的配置api,可以为identityserver用户使用asp.net身份管理库。

entityframework核心

nuget | github上

entityframework identityserver的核心存储实现。此程序包为identityserver中的配置和操作存储提供entityframework实现。

开发构建

此外,我们将开发/临时构建发布到myget。如果要尝试尝试,请将以下feed添加到visual studio:

https://www.myget.org/f/identity/

支持和咨询选项

我们为identityserver提供了多种免费和商业支持和咨询选项。

免费支持

免费支持是基于社区的,并使用公共论坛

堆栈溢出

有越来越多的人使用identityserver来监控stackoverflow上的问题。如果时间允许,我们也会尝试回答尽可能多的问题

您可以使用此feed订阅所有identityserver4相关问题:

identityserver4在提出新问题时请使用标签

小胶质

您可以在我们的gitter聊天室中与其他identityserver4用户聊天:

https://gitter.im/identityserver/identityserver4

报告错误

如果您认为自己发现了错误或意外行为,请在github 问题跟踪器上打开一个问题。我们会尽快回复您。请理解我们也有日常工作,可能太忙而无法立即回复。

在发布之前还要检查贡献指南。

商业支持

我们正在围绕身份和访问控制架构进行咨询,指导和定制软件开发,特别是identityserver。请取得联系与我们共同探讨可行方案。

训练

我们经常围绕现代应用的身份和访问控制进行研讨会。在查看议程和即将公布的日期 。我们也可以在贵公司私下进行培训。 联系我们以请求现场培训。

admin ui,identity express和saml2p支持

我们的合作伙伴提供了几种商业附加产品,请访问

演示服务器和测试

您可以使用您喜欢的客户端库尝试identityserver4。我们在有一个测试实例。在主页面上,您可以找到有关如何配置客户端以及如何调用api的说明。

此外,我们还有一个repo,可以运行各种identityserver和web api组合(identityserver 3和4,asp.net core和katana)。我们使用此测试工具确保所有排列都有效。您可以通过克隆 repo来自行测试。

贡献

我们对社区贡献非常开放,但您应该遵循一些指导方针,以便我们可以毫不费力地处理这个问题。

如何贡献?

最简单的贡献方式是打开一个问题并开始讨论。然后我们可以决定是否以及如何实现功能或更改。如果您应该提交带有代码更改的pull请求,请从描述开始,只进行最小的更改并提供涵盖这些更改的测试。

首先阅读:

一般反馈和讨论?

请开始讨论核心回购问题跟踪器

平台

identityserver是针对asp.net core 2构建的,可在.net framework 4.6.1(及更高版本)和.net core 2(及更高版本)上运行。

错误和功能请求?

请在相应的github仓库中记录一个新问题:

其他讨论

https://gitter.im/identityserver/identityserver4

贡献代码和内容

在您提供任何代码或内容之前,您需要签署贡献者许可协议。这是一个自动过程,将在您打开拉取请求后启动。

注意

我们只接受开发分支的pr。

贡献项目

如果您启动贡献项目(例如,支持database x或configuration store y),我们非常感谢。告诉我们,我们可以在我们的文档中发推文和链接。

我们通常不想拥有这些贡献库,我们已经非常忙于支持核心项目。

命名约定

截至2017年10月,identityserver4。* nuget名称空间保留给我们的软件包。请使用以下命名约定:

yourprojectname.identityserver4

要么

identityserver4.contrib.yourprojectname

设置和概述

启动新identityserver项目有两种基本方法:

  • 白手起家

  • 从visual studio中的asp.net标识模板开始

如果您从头开始,我们提供了几个帮助程序和内存存储,因此您不必担心从一开始就存在持久性。

如果您从asp.net身份开始,我们也提供了一种简单的方法来集成它。

快速入门提供了各种常见identityserver方案的分步说明。他们从绝对的基础开始,变得更加复杂 - 建议你按顺序完成它们。

每个快速入门都有一个参考解决方案 - 您可以 在quickstarts文件夹中的identityserver4.samples仓库中找到代码 。

基本设置

屏幕截图显示了visual studio - 但这不是必需的。

创建快速入门identityserver

首先创建一个新的asp.net core项目。

然后选择“清空”选项。

接下来,添加identityserver4 nuget包:

或者,您可以使用程序包管理器控制台通过运行以下命令来添加依赖项:

“安装包identityserver4”

注意

identityserver构建编号1.x目标asp.net core 1.1,identityserver构建编号2.x目标asp.net core 2.0。

identityserver使用通常的模式为asp.net core主机配置和添加服务。在configureservices所需的服务中配置并添加到di系统。在configure中间件中添加到http管道。

startup.cs文件修改为如下所示:

public class startup
{
   public void configureservices(iservicecollection services)
  {
       services.addidentityserver()
          .adddevelopersigningcredential();
  }

   public void configure(iapplicationbuilder app, ihostingenvironment env)
  {
       if (env.isdevelopment())
      {
           app.usedeveloperexceptionpage();
      }

       app.useidentityserver();
  }
}

addidentityserver在di中注册identityserver服务。它还为运行时状态注册内存存储。这对于开发方案很有用。对于生产方案,您需要一个持久性或共享存储,如数据库或缓存。有关详细信息,请参阅entityframework快速入门。

adddevelopersigningcredential扩展程序为签名令牌创建临时密钥材料。同样,这可能对入门有用,但需要替换为生产场景的一些持久性密钥材料。有关更多信息,请参阅

注意

identityserver尚未准备好启动。我们将在以下快速入门中添加所需的服务。

修改主机

默认情况下,visual studio使用iis express来托管您的web项目。这完全没问题,除了您将无法看到控制台的实时日志输出。

identityserver广泛使用日志记录,而ui中的“可见”错误消息或返回给客户端是故意模糊的。

我们建议在控制台主机中运行identityserver。您可以通过在visual studio中切换启动配置文件来完成此操作。每次启动identityserver时也不需要启动浏览器 - 您也可以关闭它:

 

此外,在这些快速入门的一致url上运行identityserver会很有帮助。您还应该在上面的启动配置文件对话框中配置此url,然后使用http://www.lhsxpumps.com/_localhost:5000/。在上面的屏幕截图中,您可以看到此url已配置。

注意

我们建议为iis express和自托管配置相同的端口。这样,您可以在两者之间切换,而无需修改客户端中的任何配置。

要在启动时选择控制台主机,必须在visual studio的启动菜单中选择它:

如何运行快速入门

如上所述,每个快速入门都有一个参考解决方案 - 您可以 在quickstarts文件夹中的identityserver4.samples repo中找到代码 。

运行快速入门解决方案各个部分的最简单方法是将启动模式设置为“当前选择”。右键单击解决方案并选择“设置启动项目”:

通常,首先启动identityserver,然后启动api,然后启动客户端。如果您确实想要调试,只能在调试器中运行。否则ctrl + f5是运行项目的最佳方式。

使用客户端凭据保护

本快速入门介绍了使用identityserver保护api的最基本方案。

在这种情况下,我们将定义一个api和一个想要访问它的客户端。客户端将在identityserver请求访问令牌并使用它来获取对api的访问权限。

定义

范围定义了您要保护的系统中的资源,例如api。

由于我们在本演练中使用内存配置 - 您只需创建一个类型的对象apiresource并设置适当的属性即可。

将文件(例如config.cs)添加到项目中并添加以下代码:

public static ienumerable<apiresource> getapiresources()
{
   return new list<apiresource>
  {
       new apiresource("api1", "my api")
  };
}

定义客户端

下一步是定义可以访问此api的客户端。

对于此方案,客户端将不具有交互式用户,并将使用identityserver的所谓客户端密钥进行身份验证。将以下代码添加到config.cs文件中:

public static ienumerable<client> getclients()
{
   return new list<client>
  {
       new client
      {
           clientid = "client",

           // no interactive user, use the clientid/secret for authentication
           allowedgranttypes = granttypes.clientcredentials,

           // secret for authentication
           clientsecrets =
          {
               new secret("secret".sha256())
          },

           // scopes that client has access to
           allowedscopes = { "api1" }
      }
  };
}

配置identityserver

要将identityserver配置为使用范围和客户端定义,您需要向configureservices方法添加代码。您可以使用方便的扩展方法 - 在封面下,这些将相关的存储和数据添加到di系统中:

public void configureservices(iservicecollection services)
{
   // configure identity server with in-memory stores, keys, clients and resources
   services.addidentityserver()
      .adddevelopersigningcredential()
      .addinmemoryapiresources(config.getapiresources())
      .addinmemoryclients(config.getclients());
}

就是这样 - 如果您运行服务器并浏览浏览器 http://localhost:5000/.well-known/openid-configuration,您应该会看到所谓的发现文档。客户端和api将使用它来下载必要的配置数据。

添加

接下来,为您的解决方案添加api。

您可以使用asp.net core web api模板。同样,我们建议您控制端口并使用与以前配置kestrel和启动配置文件相同的技术。本演练假定您已将api配置为运行http://localhost:5001

控制器

向api项目添加新控制器:

[route("identity")]
[authorize]
public class identitycontroller : controllerbase
{
  [httpget]
   public iactionresult get()
  {
       return new jsonresult(from c in user.claims select new { c.type, c.value });
  }
}

稍后将使用此控制器来测试授权要求,以及通过api的眼睛可视化声明身份。

组态

最后一步是将身份验证服务添加到di和身份验证中间件到管道。这些将:

  • 验证传入令牌以确保它来自受信任的颁发者

  • 验证令牌是否有效用于此api(aka范围)

将identityserver4.accesstokenvalidation nuget包添加到项目中。

将startup更新为如下所示:

public class startup
{
   public void configureservices(iservicecollection services)
  {
       services.addmvccore()
          .addauthorization()
          .addjsonformatters();

       services.addauthentication("bearer")
          .addidentityserverauthentication(options =>
          {
               options.authority = "http://localhost:5000";
               options.requirehttpsmetadata = false;

               options.apiname = "api1";
          });
  }

   public void configure(iapplicationbuilder app)
  {
       app.useauthentication();

       app.usemvc();
  }
}

addauthentication将身份验证服务添加到di并配置"bearer"为默认方案。addidentityserverauthentication将identityserver访问令牌验证处理程序添加到di中以供身份验证服务使用。 useauthentication将身份验证中间件添加到管道中,以便在每次调用主机时自动执行身份验证。

如果您使用浏览器导航到控制器(http://localhost:5001/identity),您应该获得401状态代码作为回报。这意味着您的api需要凭据。

就是这样,api现在受到identityserver的保护。

创建客户端

最后一步是编写请求访问令牌的客户端,然后使用此令牌访问api。为此,请向您的解决方案添加一个控制台项目(请参阅此处的完整代码)。

identityserver的令牌端点实现oauth 2.0协议,您可以使用原始http来访问它。但是,我们有一个名为identitymodel的客户端库,它将协议交互封装在一个易于使用的api中。

将identitymodel nuget包添加到您的应用程序。

identitymodel包括用于发现端点的客户端库。这样您只需要知道identityserver的基地址 - 可以从元数据中读取实际的端点地址:

// discover endpoints from metadata
var disco = await discoveryclient.getasync("http://localhost:5000");
if (disco.iserror)
{
  console.writeline(disco.error);
  return;
}

接下来,您可以使用tokenclient该类来请求令牌。要创建实例,您需要传递令牌端点地址,客户端id和密码。

接下来,您可以使用该requestclientcredentialsasync方法为您的api请求令牌:

// request token
var tokenclient = new tokenclient(disco.tokenendpoint, "client", "secret");
var tokenresponse = await tokenclient.requestclientcredentialsasync("api1");

if (tokenresponse.iserror)
{
   console.writeline(tokenresponse.error);
   return;
}

console.writeline(tokenresponse.json);

注意

将访问令牌从控制台复制并粘贴到以检查原始令牌。

最后一步是调用api。

要将访问令牌发送到api,通常使用http authorization标头。这是使用setbearertoken扩展方法完成的:

// call api
var client = new httpclient();
client.setbearertoken(tokenresponse.accesstoken);

var response = await client.getasync("http://localhost:5001/identity");
if (!response.issuccessstatuscode)
{
   console.writeline(response.statuscode);
}
else
{
   var content = await response.content.readasstringasync();
   console.writeline(jarray.parse(content));
}

输出应如下所示:

注意

默认情况下,访问令牌将包含有关范围,生命周期(nbf和exp),客户端id(client_id)和颁发者名称(iss)的声明。

进一步的实验

本演练重点关注目前的成功之路

  • 客户端能够请求令牌

  • 客户端可以使用令牌来访问api

您现在可以尝试激发错误以了解系统的行为,例如

  • 尝试在未运行时连接到identityserver(不可用)

  • 尝试使用无效的客户端id或机密来请求令牌

  • 尝试在令牌请求期间请求无效范围

  • 尝试在api未运行时调用api(不可用)

  • 不要将令牌发送到api

  • 将api配置为需要与令牌中的范围不同的范围

使用密码保护

oauth 2.0资源所有者密码授予允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌。

规范建议仅对“受信任”(或遗留)应用程序使用资源所有者密码授予。一般来说,当您想要对用户进行身份验证并请求访问令牌时,通常会更好地使用其中一个交互式openid connect流程。

尽管如此,这种授权类型允许我们将用户的概念引入我们的快速启动identityserver,这就是我们展示它的原因。

添加用户

就像资源(也称为范围)和客户端的内存存储一样,用户也有一个。

注意

有关如何正确存储和管理用户帐户的详细信息,请查看基于asp.net身份的快速入门。

该类testuser代表测试用户及其声明。让我们通过在config类中添加以下代码来创建几个用户:

首先将以下using语句添加到config.cs文件中:

using identityserver4.test;

public static list<testuser> getusers()
{
   return new list<testuser>
  {
       new testuser
      {
           subjectid = "1",
           username = "alice",
           password = "password"
      },
       new testuser
      {
           subjectid = "2",
           username = "bob",
           password = "password"
      }
  };
}

然后使用identityserver注册测试用户:

public void configureservices(iservicecollection services)
{
   // configure identity server with in-memory stores, keys, clients and scopes
   services.addidentityserver()
      .adddevelopersigningcredential()
      .addinmemoryapiresources(config.getapiresources())
      .addinmemoryclients(config.getclients())
      .addtestusers(config.getusers());
}

addtestusers扩展方法做了几件事情引擎盖下

  • 添加对资源所有者密码授予的支持

  • 添加对登录ui通常使用的用户相关服务的支持(我们将在下一个快速入门中使用它)

  • 添加对基于测试用户的配置文件服务的支持(您将在下一个快速入门中了解更多信息)

为资源所有者密码授予添加客户端

您可以通过更改allowedgranttypes属性来简单地向现有客户端添加对授权类型的支持 。如果您需要您的客户端能够使用绝对支持的两种授权类型。

通常,您希望为资源所有者用例创建单独的客户端,将以下内容添加到客户端配置中:

public static ienumerable<client> getclients()
{
   return new list<client>
  {
       // other clients omitted...

       // resource owner password grant client
       new client
      {
           clientid = "ro.client",
           allowedgranttypes = granttypes.resourceownerpassword,

           clientsecrets =
          {
               new secret("secret".sha256())
          },
           allowedscopes = { "api1" }
      }
  };
}

使用密码授权请求令牌

客户端看起来与我们为客户端凭据授予所做的非常相似。主要区别在于客户端会以某种方式收集用户的密码,并在令牌请求期间将其发送到令牌服务。

identitymodel再次tokenclient可以在这里提供帮助:

// request token
var tokenclient = new tokenclient(disco.tokenendpoint, "ro.client", "secret");
var tokenresponse = await tokenclient.requestresourceownerpasswordasync("alice", "password", "api1");

if (tokenresponse.iserror)
{
   console.writeline(tokenresponse.error);
   return;
}

console.writeline(tokenresponse.json);
console.writeline("\n\n");

将令牌发送到身份api端点时,您会注意到与客户端凭据授权相比有一个小但重要的区别。访问令牌现在将包含sub唯一标识用户的声明。通过在调用api之后检查内容变量可以看到这个“子”声明,并且控制器应用程序也会在屏幕上显示该声明。

声明的存在(或不存在)sub允许api区分代表客户的呼叫和代表用户的呼叫。

使用openid connect添加用户认证

在本快速入门中,我们希望通过openid connect协议为我们的identityserver添加对交互式用户身份验证的支持。

一旦到位,我们将创建一个将使用identityserver进行身份验证的mvc应用程序。

添加

openid connect所需的所有协议支持已内置于identityserver中。您需要为登录,注销,同意和错误提供必要的ui部件。

虽然外观和精确的工作流程在每个identityserver实现中可能总是不同,但我们提供了一个基于mvc的示例ui,您可以将其用作起点。

可以在快速入门ui存储库中找到此ui 。您可以克隆或下载此repo,并将控制器,视图,模型和css放入identityserver web应用程序中。

或者,您可以从与identityserver web应用程序相同的目录中的命令行运行此命令,以自动执行下载:

iex ((new-object system.net.webclient).downloadstring('https://raw.githubusercontent.com/identityserver/identityserver4.quickstart.ui/release/get.ps1'))

对于unix / linux:

\curl -l https://raw.githubusercontent.com/identityserver/identityserver4.quickstart.ui/release/get.sh | bash

添加mvc ui资产后,您还需要在di系统和管道中将mvc添加到托管应用程序。configureservices使用addmvc扩展方法添加mvc :

public void configureservices(iservicecollection services)
{
   services.addmvc();

   // configure identity server with in-memory stores, keys, clients and scopes
   services.addidentityserver()
      .adddevelopersigningcredential()
      .addinmemoryapiresources(config.getapiresources())
      .addinmemoryclients(config.getclients())
      .addtestusers(config.getusers());
}

configure使用usemvc扩展方法将mvc添加为管道中的最后一个中间件:

public void configure(iapplicationbuilder app, ihostingenvironment env)
{
   if (env.isdevelopment())
  {
       app.usedeveloperexceptionpage();
  }

   app.useidentityserver();

   app.usestaticfiles();
   app.usemvcwithdefaultroute();
}

有关详细信息,请参阅快速入门ui 的自述文件

注意

releaseui repo 的分支具有与最新稳定版本匹配的ui。该dev分支与identityserver4的当前开发版本一起使用。如果您正在寻找特定版本的ui - 请检查标签。

花一些时间检查控制器和模型,您越了解它们,就越容易进行未来的修改。大多数代码使用“功能文件夹”样式存在于“quickstart”文件夹中。如果此样式不适合您,请随意以您想要的任何方式组织代码。

创建mvc客户端

接下来,您将向您的解决方案添加mvc应用程序。使用asp.net core“web应用程序”(即mvc)模板。不要在向导中配置“身份验证”设置 - 您将在此快速入门中手动执行此操作。创建项目后,将应用程序配置为使用端口5002(有关如何执行此操作的说明,请参阅概述部分)。

要为id连接的认证支持添加到了mvc应用程序,添加以下内容configureservicesstartup

public void configureservices(iservicecollection services)
{
   services.addmvc();

   jwtsecuritytokenhandler.defaultinboundclaimtypemap.clear();

   services.addauthentication(options =>
      {
           options.defaultscheme = "cookies";
           options.defaultchallengescheme = "oidc";
      })
      .addcookie("cookies")
      .addopenidconnect("oidc", options =>
      {
           options.signinscheme = "cookies";

           options.authority = "http://localhost:5000";
           options.requirehttpsmetadata = false;

           options.clientid = "mvc";
           options.savetokens = true;
      });
}

addauthentication将身份验证服务添加到di。作为主装置来验证用户(通过我们使用一个cookie "cookies"defaultscheme)。我们设置为defaultchallengeschemeto,"oidc"因为当我们需要用户登录时,我们将使用openid connect方案。

然后addcookie,我们使用添加可以处理cookie的处理程序。

最后,addopenidconnect用于配置执行openid connect协议的处理程序。这authority表明我们信任identityserver。然后我们通过clientid。识别这个客户。 signinscheme用于在openid connect协议完成后使用cookie处理程序发出cookie。并且savetokens用于在cookie中保留来自identityserver的令牌(因为稍后将需要它们)。

同样,我们已经关闭了jwt声明类型映射,以允许众所周知的声明(例如“sub”和“idp”)流畅地通过:

jwtsecuritytokenhandler.defaultinboundclaimtypemap.clear();

然后要确保认证服务执行对每个请求,加入useauthenticationconfigurestartup

public void configure(iapplicationbuilder app, ihostingenvironment env)
{
   if (env.isdevelopment())
  {
       app.usedeveloperexceptionpage();
  }
   else
  {
       app.useexceptionhandler("/home/error");
  }

   app.useauthentication();

   app.usestaticfiles();
   app.usemvcwithdefaultroute();
}

应该在管道中的mvc之前添加认证中间件。

最后一步是触发身份验证握手。为此,请转到主控制器并添加[authorize]其中一个操作。同时修改该操作的视图以显示用户的声明,例如:

<dl>
   @foreach (var claim in user.claims)
  {
       <dt>@claim.type</dt>
       <dd>@claim.value</dd>
  }
</dl>

如果您现在使用浏览器导航到该控制器,将尝试重定向到identityserver - 这将导致错误,因为mvc客户端尚未注册。

添加对openid connect标识范围的支持

与oauth 2.0类似,openid connect也使用范围概念。同样,范围代表您想要保护的内容以及客户想要访问的内容。与oauth相比,oidc中的范围不代表api,而是代表用户id,名称或电子邮件地址等身份数据。

通过添加新助手(in )来创建对象集合,添加对标准openid(subject id)和profile(名字,姓氏等)范围的支持:config.cs``identityresource

public static ienumerable<identityresource> getidentityresources()
{
  return new list<identityresource>
  {
      new identityresources.openid(),
      new identityresources.profile(),
  };
}

注意

所有标准范围及其相应的声明都可以在openid connect 规范中找到

然后,您需要将这些标识资源添加到identityserver配置中startup.cs。使用addinmemoryidentityresources您调用的扩展方法addidentityserver()

public void configureservices(iservicecollection services)
{
  services.addmvc();

  // configure identity server with in-memory stores, keys, clients and scopes
  services.addidentityserver()
      .adddevelopersigningcredential()
      .addinmemoryidentityresources(config.getidentityresources())
      .addinmemoryapiresources(config.getapiresources())
      .addinmemoryclients(config.getclients())
      .addtestusers(config.getusers());
}

为openid connect隐式流添加客户端

最后一步是将mvc客户端的新配置条目添加到identityserver。

基于openid connect的客户端与我们目前添加的oauth 2.0客户端非常相似。但由于oidc中的流程始终是交互式的,因此我们需要在配置中添加一些重定向url。

将以下内容添加到客户端配置中:

public static ienumerable<client> getclients()
{
  return new list<client>
  {
      // other clients omitted...

      // openid connect implicit flow client (mvc)
      new client
      {
          clientid = "mvc",
          clientname = "mvc client",
          allowedgranttypes = granttypes.implicit,

          // where to redirect to after login
          redirecturis = { "http://localhost:5002/signin-oidc" },

          // where to redirect to after logout
          postlogoutredirecturis = { "http://localhost:5002/signout-callback-oidc" },

          allowedscopes = new list<string>
          {
              identityserverconstants.standardscopes.openid,
              identityserverconstants.standardscopes.profile
          }
      }
  };
}

测试客户端

现在终于应该为新的mvc客户端做好一切准备。

通过导航到受保护的控制器操作来触发

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网