第9章 使用客户端凭据保护API - Identity Server 4 中文文档(v1.0.0)
快速入门介绍了使用IdentityServer保护API的最基本方案。 我们将定义一个API和一个想要访问它的客户端。 客户端将通过提供ClientCredentials
在IdentityServer请求访问令牌,ClientCredentials
充当客户端和IdentityServer都知道的秘密,并且它将使用该令牌来访问API。
9.1设置ASP.NET核心应用程序
首先为应用程序创建一个目录 - 然后使用我们的模板创建一个包含基本IdentityServer设置的ASP.NET Core应用程序,例如:
md quickstart
cd quickstart
md src
cd src
dotnet new is4empty -n IdentityServer
这将创建以下文件:
- IdentityServer.csproj- 项目文件和Properties\launchSettings.json文件
- Program.cs和Startup.cs- 主要的应用程序入口点
- Config.cs - IdentityServer资源和客户端配置文件
您现在可以使用自己喜欢的文本编辑器来编辑或查看文件。如果您希望获得Visual Studio支持,可以添加如下解决方案文件:
cd ..
dotnet new sln -n Quickstart
然后让它添加你的IdentityServer项目(记住这个命令,因为我们将在下面创建其他项目):
dotnet sln add .\src\IdentityServer\IdentityServer.csproj
注意
此模板中使用的协议是http
,当在Kestrel
上运行时,端口设置为5000
或IISExpress
上的随机端口。您可以在Properties\launchSettings.json
文件中更改它。但是,所有快速入门指令都假定您使用Kestrel
上的默认端口以及http
协议,该协议足以进行本地开发。
9.2 定义API资源
API是您要保护的系统中的资源。
资源定义可以通过多种方式加载,模板使用“代码作为配置”appproach。在Config.cs文件中,您可以找到一个名为GetApisAPI 的方法,如下所示:
public static IEnumerable<ApiResource> GetApis()
{
return new List<ApiResource>
{
new ApiResource("api1", "My API")
};
}
9.3 定义客户端
下一步是定义可以访问此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" }
}
};
}
9.4 配置IdentityServer
在Startup.cs
加载资源和客户端定义 - 模板已经为您执行此操作:
public void ConfigureServices(IServiceCollection services)
{
var builder = services.AddIdentityServer()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApis())
.AddInMemoryClients(Config.GetClients());
// rest omitted
}
就是这样 - 如果您运行服务器并浏览浏览器 http://localhost:5000/.well-known/openid-configuration
,您应该会看到所谓的发现文档。客户端和API将使用它来下载必要的配置数据。
首次启动时,IdentityServer将为您创建一个开发人员签名密钥,它是一个名为的文件tempkey.rsa
。您不必将该文件检入源代码管理中,如果该文件不存在,将重新创建该文件。
9.5 添加API
接下来,为您的解决方案添加API。
您可以使用Visual Studio中的ASP.NET Core Web API(或空)模板,也可以使用.NET CLI来创建API项目。从src
文件夹中运行以下命令:
dotnet new web -n Api
然后通过运行以下命令将其添加到解决方案中:
cd ..
dotnet sln add .\src\Api\Api.csproj
将API应用程序配置为http://localhost:5001
仅运行。您可以通过编辑Properties文件夹中的launchSettings.json
文件来完成此操作。将应用程序URL设置更改为:
"applicationUrl": "http://localhost:5001"
9.6 控制器
在API项目中添加一个新文件夹Controllers和一个新控制器IdentityController
:
[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的眼睛(浏览工具)来可视化身份信息。
9.7 配置
最后一步是将身份验证服务添加到DI和身份验证中间件到管道。这些将:
- 验证输入的令牌以确保它来自可信任的发布者(IdentityServer)
- 验证令牌是否可用于该 api(也就是 Scope)。
将Startup
更新为如下所示:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters();
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.Audience = "api1";
});
}
public void Configure(IApplicationBuilder app)
{
app.UseAuthentication();
app.UseMvc();
}
}
AddAuthentication
将身份验证服务添加到DI并配置"Bearer"
为默认方案。 UseAuthentication
将身份验证中间件添加到管道中,以便在每次调用主机时自动执行身份验证。
http://localhost:5001/identity
在浏览器上导航到控制器应返回401状态代码。这意味着您的API需要凭证,现在受IdentityServer保护。
9.8 创建客户端
最后一步是编写请求访问令牌的客户端,然后使用此令牌访问API。为此,在您的解决方案中添加一个控制台项目,请记住在以下位置创建它src:
dotnet new console -n Client
然后和以前一样,使用以下方法将其添加到您的解
cd ..
dotnet sln add .\src\Client\Client.csproj
打开Program.cs并将内容从这里复制到它。
客户端程序异步调用Main
方法以运行异步http
调用。 从C#7.1
开始,此功能可用,一旦您编辑Client.csproj以将以下行添加为PropertyGroup
,它就可用:
<LangVersion>latest</LangVersion>
IdentityServer的令牌端点实现OAuth 2.0协议,您可以使用原始HTTP来访问它。但是,我们有一个名为IdentityModel
的客户端库,它将协议交互封装在易于使用的API中。
将IdentityModel
NuGet包添加到您的客户端。这可以通过Visual Studio的nuget对话框,手动添加到Client.csproj文件,或使用CLI来完成:
dotnet add package IdentityModel
IdentityModel包括用于发现端点的客户端库。这样您只需要知道IdentityServer的基地址 - 可以从元数据中读取实际的端点地址:
// discover endpoints from metadata
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000");
if (disco.IsError)
{
Console.WriteLine(disco.Error);
return;
}
接下来,您可以使用发现文档中的信息向IdentityServer请求令牌以访问api1:
// request token
var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "client",
ClientSecret = "secret",
Scope = "api1"
});
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}
Console.WriteLine(tokenResponse.Json);
注意
将访问令牌从控制台复制并粘贴到https://jwt.io/以检查原始令牌。
9.9 调用
要将访问令牌发送到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));
}
输出应如下所示:
注意
默认情况下,访问令牌将包含有关范围(scope),生命周期(nbf和exp),客户端ID(client_id)和颁发者名称(iss)的声明。
9.10 进一步的实验
本演练重点介绍了迄今为止的成功之路
- 客户端能够请求令牌
- 客户端可以使用令牌来访问API
你现在可以尝试引发一些错误来学习系统的相关行为,比如:
- 尝试在未运行时连接到IdentityServer(不可用)
- 尝试使用无效的客户端ID或密码来请求令牌
- 尝试在令牌请求期间请求无效范围
- 尝试在API未运行时调用API(不可用)
- 不要将令牌发送到API
- 将API配置为需要与令牌中的范围不同的范围
第9章 使用客户端凭据保护API - Identity Server 4 中文文档(v1.0.0)的更多相关文章
- 第29章 保护API - Identity Server 4 中文文档(v1.0.0)
IdentityServer 默认以JWT(JSON Web令牌)格式发出访问令牌. 今天的每个相关平台都支持验证JWT令牌,这里可以找到一个很好的JWT库列表.热门库例如: ASP.NET Core ...
- 第10章 使用密码保护API - Identity Server 4 中文文档(v1.0.0)
OAuth 2.0资源所有者密码授权允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌. 除了无法承载浏览器的旧应用程序之外,规范通常建议不要使用资源所有者密码授予.一般来说,当您要对用 ...
- 第17章 社区快速入门和模板 - Identity Server 4 中文文档(v1.0.0)
IdentityServer组织不维护这些示例.IdentityServer组织愉快地链接到社区模板,但不能对模板做出任何保证.请直接与作者联系. 17.1 各种ASP.NET核心安全样本 https ...
- 第12章 添加对外部认证的支持 - Identity Server 4 中文文档(v1.0.0)
注意 对于任何先决条件(例如模板),首先要查看概述. 接下来,我们将添加对外部认证的支持.这非常简单,因为您真正需要的是ASP.NET Core兼容的身份验证处理程序. ASP.NET Core本身支 ...
- 第25章 退出外部身份提供商 - Identity Server 4 中文文档(v1.0.0)
当用户注销 IdentityServer并且他们使用外部身份提供程序登录时,可能会将其重定向到注销外部提供程序.并非所有外部提供商都支持注销,因为它取决于它们支持的协议和功能. 要检测是否必须将用户重 ...
- 第14章 添加JavaScript客户端 - Identity Server 4 中文文档(v1.0.0)
本快速入门将展示如何构建基于浏览器的JavaScript客户端应用程序(有时称为" SPA "). 用户将登录IdentityServer,使用IdentityServer发出的访 ...
- 第65章 博客帖子 - Identity Server 4 中文文档(v1.0.0)
第65章 博客帖子 65.1 团队帖子 65.1.1 2019 IdentityServer中的范围和声明设计 尝试使用IdentityServer4的设备流程 OAuth2中隐含流的状态 另一种保护 ...
- 第34章 授予类型 - Identity Server 4 中文文档(v1.0.0)
授权类型是指定客户端如何与IdentityServer交互的方式.OpenID Connect和OAuth2.0规范定义了以下授权类型: Implicit Authorization code Hyb ...
- 第18章 启动 - Identity Server 4 中文文档(v1.0.0)
IdentityServer是中间件和服务的组合.所有配置都在您的启动类中完成. 18.1 配置服务 您可以通过调用以下方法将IdentityServer服务添加到DI系统: public void ...
随机推荐
- SpringBoot报错:nested exception is org.apache.ibatis.executor.ExecutorException: No constructor found in com.tuyrk.test.User matching [java.lang.Long, java.lang.String, java.lang.String]
错误提示: Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in com.tuyrk._16 ...
- 马昕璐201771010118 《面对对象程序设计(java)》第九周学习总结
第一部分:理论知识学习部分 异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. Java把程序运行时可能遇到的错误分为两类: 非致命异常:通过某种修正后程序还能继续执行. 致命异常:程序 ...
- JS DOM事件学习
DOM查找方法: document.getElementByID("id") document.getElementsByTagName("tag") 返回一个 ...
- vue - 新建一个项目
首先: 要先安装node 及 npm Node.js官方安装包及源码下载地址:http://nodejs.org/ 双击安装,在安装界面一直Next 直到Finish完成安装. 打开控制命令行程序(C ...
- javaweb聊天室源码免费
效果:可擴展源碼,免費技術指導,電話13956301647 链接:https://pan.baidu.com/s/1FWV8DNWacGaEpAQEsWsNaw 提取码:b6gf
- Jmeter中连接Oracle报错Cannot create PoolableConnectionFactory
填坑贴,之前一直用jmeter2.13版本进行oracle测试,今天改为3.2版本,发现按照以往的方法执行测试,JDBC Request结果始终报错:Cannot create PoolableCon ...
- node.js Setup Wizard ended prematurely 安装失败
解决: 1. 按照管理员权限运行. 2.安装时禁用掉node 运行环境中的performance counters 和 ETW,或者可以尝试先禁用performance counters .
- barrel_shift
barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如: *dw-:]; -:];// 0~132 *dw-:]; 上面就要求从256的数据单元中选择124个数据单元输出, ...
- nova vnc proxy基本原理
先上图 VNC Proxy的功能: 将公网(public network)和私网(private network)隔离 VNC client运行在公网上,VNCServer运行在私网上,VNC Pro ...
- 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)
开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...