内容:本文带大家使用IdentityServer4进行对API授权保护的基本策略

作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址。

  本文将要讲述如何使用IdentityServer4对API授权保护以及如何携带Token进行访问受保护的API,通过HttpClient或Http请求中的body这些我们都可以达到。那么废话不多说,开始吧~

  首先我们一定要知道,我们访问要访问一个受安全限制的API的锁子是在一个专门的IdentityServer4验证服务器。所以呢,我们需要创建一个认证服务器。首先我们创建一个API项目。

创建完成之后,我们再创建一个Config.cs,当然这个名字你随意,但你需要在DI注入的时候与其对应。在 GetSoluction 中定义了我们的API,也就是受保护的锁子,第一个参数是name,也就是Api的名称,那么后面是显示的名字,也就是DisplayName。在 GetClients 当中我们定义了受信任的客户端,其中有客户端的ID,授权方式,客户端加密方式,通过 AllowedScopes  还定义了这个客户端可以访问的API。

using IdentityServer4.Models;
using System.Collections.Generic; namespace IdentityServerSolution
{
/// <summary>
/// zaranet 2019.1.26 14.10 create this file
/// Config是IdentityServer的配置文件,一会我们需要注册到DI层。
/// </summary>
public class Config
{
/// <summary>
/// 这个ApiResource参数就是我们Api
/// </summary>
/// <returns></returns>
public static IEnumerable<ApiResource> GetSoluction()
{
return new[]
{
new ApiResource("api1", "MY API")
};
}
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "Client",
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets = {
new Secret("secret".Sha256()),
},
AllowedScopes = {"api1"}
}
};
}
}
}

  我们现在已经写好了关于IdentityServer4服务器的配置文件,那么我们还需要去依赖注入到.NET Core管道中,现在我们看一下定义。

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddInMemoryApiResources(Config.GetSoluction())
.AddInMemoryClients(Config.GetClients())
.AddDeveloperSigningCredential(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//添加认证中间件
app.UseIdentityServer();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}

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

首次启动时,IdentityServer将为您创建一个开发人员签名密钥,它是一个名为的文件tempkey.rsa。您不必将该文件检入源代码管理中,如果该文件不存在,将重新创建该文件。

  以下是用PostMan进行的测试,以HttpPost方式进行请求,并在Http Body中进行编辑请求体上下文,测试结果如下。如果三个参数没有问题就返回token,如果其中三个参数有一个写错,那么就会返回400错误(error:invalid_client)。

下面在API项目中添加控制器:

   [Route("identity")]
[Authorize]
[ApiController]
public class IdentityController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
}
}

  稍后将使用此控制器来测试授权要求,以及通过API的眼睛可视化声明身份。现在我们将身份验证服务添加到DI和身份验证中间价到管道中,验证传入令牌以确保它来自受信任的颁发者。

将Startup更新为如下所示:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters();
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "http://localhost:58653";
options.RequireHttpsMetadata = false; options.Audience = "api1";
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
 AddAuthentication 是为了用于将IdentityServer4访问令牌验证处理程序将在DI中提供身份验证服务。 UseAuthentication 将身份验证中间件添加到管道中,以便在每次调用主机时自动执行身份验证。如果你现在转到 http://localhost:prot/identity
中是401错误的话,说明API已经得到了保护。配置成功了!,现在我们要创建我们的客户端了。去访问受保护的API需要携带钥匙,那么这个钥匙术语叫做令牌,那就是通往大门的令牌!现在立刻创建一个控制台程序,使用令牌访问API。
首先我们需要安装IdentityModel,因为它可以替我们找到元数据。

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

var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("http://localhost:58653");
if (disco.IsError)
{
Console.WriteLine(disco.Error);
return;
}

接下来,您可以使用发现文档中的信息来请求令牌:

var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "Client", //id
ClientSecret = "secret", //pwd
Scope = "api1" //请求的api
}); if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}

要将访问令牌发送到API,通常使用HTTP Authorization标头。这是使用 SetBearerToken 扩展方法完成的:

var Apiclient = new HttpClient();
Apiclient.SetBearerToken(tokenResponse.AccessToken); var response = await client.GetAsync("http://localhost:58653/identity");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(JArray.Parse(content));
}

就这样,我们启动结果如下,启动顺序,应先启动身份认证平台,然后再启动API,在启动控制台调试工具。

  就这样一个简单的IdentityServer4身份认证平台就OK了,现在是不是想要迫切的试一下呢?哈哈,关于源代码,我放到我的Coding中了,地址是:https://coding.net/u/zaranet/p/IdentitySERVER,当然不要看着简单,还是自己敲一下吧,如果你一点都没有碰过IdentityServer的话。下面我们在回顾一下。

  我们在 IdentityServerSoluction 中定义了 Config 文件,用于Id4的配置,主要功能是为了认证模型,其中还设置了Client请求文中的 ClientId 这些参数等等。那么 IdentItyAPI 就是我们的项目服务,其中通过 Authorize 标记的都是具有安全保护的API控制器,那么我们就需要去获取我们的IdentityServerSoluction 中的验证,这样我们才可以访问,那么我们就用了.NET Core控制台程序去模拟了这个过程,其中涉及了 HttpClient 相关知识。那么最后返回了我们的相关 token ,这样,我们可以根据 token 去获取我们想要的API服务了!

  最后祝大家春运快乐。下一篇干货在等大家噢!

.NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据的更多相关文章

  1. .NET Core IdentityServer4实战 第Ⅳ章-集成密码登陆模式

    回顾下ClientCredentials模式,在ReSourceApi中定义了我们公开服务,第三方网站想要去访问ReSourceApi则需要在身份验证服务中获取toekn,根据token的内容,硬编码 ...

  2. .NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

    内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 在这一篇文章中我们希望使用Ope ...

  3. .NET Core IdentityServer4实战 第Ⅴ章-单点登录

    OiDc可以说是OAuth的改造版,在最初的OAuth中,我们需要先请求一下认证服务器获取下Access_token,然后根据Access_token去Get资源服务器, 况且OAuth1 和 2 完 ...

  4. .NET Core IdentityServer4实战-开篇介绍与规划

    一.开篇寄语 由于假期的无聊,我决定了一个非常有挑战性的活动,也就是在年假给大家带来一个基于OAuth 2.0的身份授权框架,它就是 IdentityServer4 ,如果没有意外的话,一定可以顺利的 ...

  5. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员 ...

  6. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第一章 入门篇-开篇及总体规划

    .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划   原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来 ...

  7. Spring实战第一章学习笔记

    Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...

  8. Java学习笔记 第一章 入门<转>

    第一章 JAVA入门 一.基础常识 1.软件开发 什么是软件? 软件:一系列按照特定顺序组织的计算机数据和指令的集合 系统软件:DOS,Windows,Linux 应用软件:扫雷.QQ.迅雷 什么是开 ...

  9. 《驾驭Core Data》 第一章 Core Data概述

    <驾驭Core Data>系列教程综合了<Core Data for iOS>,<Learning Core Data for iOS>,<Core Data ...

随机推荐

  1. 面试(三)---volatile

    一.前言       最近去成都玩了一圈,整体感觉还不错,辞职以后工作找的也很顺利,随着年龄增加自己也考虑定居和个人长期发展的问题,反正乱七八糟的事,总之需要好好屡屡思路,不能那么着急下定论,当然我对 ...

  2. Vue--学习过程中遇到的坑

    在这里总结一下学习Vue遇到的易错点,持续更新 1.实例化一个Vue对象: 通过new Vue({ el:'#id', data:{ a:'字符串1', b:‘字符串2’ }) 这里的Vue必须大写V ...

  3. python笔记:#005#算数运算符

    算数运算符 计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备 目标 算术运算符的基本使用 01. 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理 ...

  4. VS下使用Google Protobuf完成SOCKET通信

    如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...

  5. 安装ie时,报:此安装不支持您的操作系统的当前语言

    打开注册表(win的"运行"栏键入 regedit 再按 OK )的HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Nls/ ...

  6. Effective C++ 读书笔记(1-7)

    作者 Scott Meyers  翻译作者 侯捷 C++ 神牛 台湾人 术语: 1.explicit C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明 ...

  7. MySQL事务的的介绍及使用

    事务的特性 1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 2.一致性(Consistency):在一个事务中,事务前后数据的完整性必 ...

  8. BOM,DOM常见操作和DHML

    BOM (Browser Object Model)浏览器对象模型,控制浏览器的一些行为 window对象 代表一个HTML文档 属性 页面导航的5个属性 self, parent, top, ope ...

  9. HiJson(Json格式化工具)64位中文版下载 v2.1.2

    链接:https://pan.baidu.com/s/15gMvig15iUjpqSX7nUZ-5Q 密码:8086

  10. CSS弹性盒子的基本用法

    .container { width: 302px; height: 302px; border: 1px solid; display: flex } .item { width: 100px; h ...