项目源码:

链接:https://pan.baidu.com/s/1H3Y0ct8xgfVkgq4XsniqFA

提取码:nzl3

一、说明

我们将定义一个api和要访问它的客户端,客户端将在identityser上请求访问令牌,并使用访问令牌调用api

二、项目结构与准备

1、创建项目QuickStartIdentityServer4的asp.net 3.1项目,端口号5001,NuGet: IdentityServer4

2、创建项目API的asp.net 3.1项目,端口号5000,NuGet: Microsoft.AspNetCore.Authentication.JwtBearer

3、创建项目Client控制台项目(sp.net 3.1),模拟客户端请求,NuGet: IdentityModel

三、QuickStartIdentityServer4项目编码

1、在QuickStartIdentityServer4项目中添加Config.cs文件

public static class Config
{
// 定义api范围
public static IEnumerable<ApiScope> ApiScopes => new []
{
new ApiScope
{
Name="sample_api", // 范围名称,自定义
DisplayName="Sample API" // 范围显示名称,自定义
}
}; // 定义客户端
public static IEnumerable<Client> Clients => new[]
{
new Client
{
ClientId="sample_client", // 客户端id
ClientSecrets =
{
new Secret("sample_client_secret".Sha256()) // 客户端秘钥 },
AllowedGrantTypes=GrantTypes.ClientCredentials, //授权类型为客户端
AllowedScopes={ "sample_api" } // 设置该客户端允许访问的api范围
}
}; }

2、在QuickStartIdentityServer4项目中Startup.cs文件添加配置

public void ConfigureServices(IServiceCollection services)
{
var builder=services.AddIdentityServer();
builder.AddDeveloperSigningCredential();
builder.AddInMemoryApiScopes(Config.ApiScopes);
builder.AddInMemoryClients(Config.Clients);
}

3、访问http://localhost:5001/.well-known/openid-configuration

4、访问http://localhost:5001/connect/token即可拿到令牌token

该token是基于jwt,我们可以在jwt官网进行查看验证,如图

四、API项目编码

1、Startup.cs文件配置

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); // 添加JWT认证方案
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", option => {
// OIDC服务地址
option.Authority = "http://localhost:5001";
// 不使用Https
option.RequireHttpsMetadata = false;
// 设置JWT的验证参数
option.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
{
// 因为使用的是api范围访问,该参数需设置false
ValidateAudience=false
}; });
// 添加api授权策略
services.AddAuthorization(options => {
// "ApiScope"为策略名称
options.AddPolicy("ApiScope", builder =>
{
builder.RequireAuthenticatedUser();
// 鉴定claim是否存在
builder.RequireClaim("scope", "sample_api");
}); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseRouting(); // 认证
app.UseAuthentication();
// 授权
app.UseAuthorization(); app.UseEndpoints(endpoints =>
{ endpoints.MapControllers();
// 设置全局策略,应用于所有api
//endpoints.MapControllers().RequireAuthorization("ApiScope");
});
}

2、添加控制器IdentityServerController并增加授权

[Route("IdentityServer")]
[Authorize("ApiScope")]
public class IdentityServerController : ControllerBase
{ public IActionResult Get()
{
return new JsonResult(from claim in User.Claims select new { claim.Type,claim.Value });
}
}

3、拿到token并请求api

五、Client项目模拟客户端请求

internal class Program
{
static async Task Main(string[] args)
{
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5001");
if (disco.IsError)
{
Console.WriteLine(disco.Error);
return;
} var tokenResponse = await client.RequestClientCredentialsTokenAsync(
new ClientCredentialsTokenRequest
{
Address= disco.TokenEndpoint,
ClientId= "sample_client",
ClientSecret= "sample_client_secret"
}
); if(tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
} Console.WriteLine(tokenResponse.Json); var apiClient = new HttpClient();
apiClient.SetBearerToken(tokenResponse.AccessToken); var response = await apiClient.PostAsync("http://localhost:5000/IdentityServer", null);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(JArray.Parse(content));
} Console.ReadKey();
}
}

项目运行效果如图

学习链接地址:https://www.cnblogs.com/stulzq/p/7495129.html

Identity Server 4客户端认证控制访问API的更多相关文章

  1. Identity Server 4资源拥有者密码认证控制访问API

    基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4客户端认证控制访问API 一.QuickStartIdenti ...

  2. IdentityServer4[3]:使用客户端认证控制API访问(客户端授权模式)

    使用客户端认证控制API访问(客户端授权模式) 场景描述 使用IdentityServer保护API的最基本场景. 我们定义一个API和要访问API的客户端.客户端从IdentityServer请求A ...

  3. IdentityServer4(7)- 使用客户端认证控制API访问(客户端授权模式)

    一.前言 本文已更新到 .NET Core 2.2 本文包括后续的Demo都会放在github:https://github.com/stulzq/IdentityServer4.Samples (Q ...

  4. k8s使用自定义证书将客户端认证接入到API Server

    自定义证书使用kubectl认证接入API Serverkubeconfig是API Server的客户端连入API Server时使用的认证格式的客户端配置文件.使用kubectl config v ...

  5. SQL Server新增用户并控制访问权限设置。

    新增用户: 一.进入数据库:[安全性]—>[登录名]—>[新建登录名] 二.在常规选项卡中.如图所示,创建登录名.注意设置默认的数据库. 三.在[用户映射]下设置该用户所能访问的数据库.并 ...

  6. Identity Server 4使用OpenID Connect添加用户身份验证(三)

    一.说明 基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4资源拥有者密码认证控制访问API(二) GitHub ...

  7. Identity Server 4 从入门到落地(三)—— 创建Web客户端

    书接上回,我们已经搭建好了基于Identity Server 4的认证服务和管理应用(如果还没有搭建,参看本系列前两部分,相关代码可以从github下载:https://github.com/zhen ...

  8. Identity Server 4 从入门到落地(四)—— 创建Web Api

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  9. Asp.Net Core: Swagger 与 Identity Server 4

    Swagger不用多说,可以自动生成Web Api的接口文档和客户端调用代码,方便开发人员进行测试.通常我们只需要几行代码就可以实现这个功能: ... builder.Services.AddSwag ...

随机推荐

  1. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  2. Typora实现云同步

    Typora很好用,但是不自带同步功能,最近找到个简便的实现Typora同步的方法. step1. 下载"坚果云": step2. 在本地创建一个"坚果云"的同 ...

  3. LVM 逻辑卷学习

    一个执着于技术的公众号 前言 每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到 当前某个分区需要的容量,还要预 ...

  4. 一文说透 MySQL JSON 数据类型(收藏)

    JSON 数据类型是 MySQL 5.7.8 开始支持的.在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档. 相对字符类型,原生的 JSON 类型具有以下优 ...

  5. 浅谈Java-String到底是值传递还是引用传递?

    参数传递 Java 中的参数传递分为 "值传递""引用传递" 如果你学过 C/C++应该很好理解,就是所谓的 "值传递" 和 "指 ...

  6. Linux系统创建可执行文件软链接

    技术背景 由于创建软链接这个事情,在算法开发的日常中使用到的并不是很多,因此本文也是做一个简单的回顾.这里我们使用的案例是通过TMalign这个蛋白质打分文件,在编译好可执行文件之后,可以使用建立软链 ...

  7. brew常用命令

    Homebrew 常用命令 brew -help # 查看帮助命令 brew config # 查看配置信息 brew list # 查看已安装软件包列表 brew cleanup # 清理所有包的旧 ...

  8. PostgreSQL(一) 编译安装运行

    原创,如转发需注明出处. 多年没写博客,一直用的个人笔记软件,最近准备阅读PostgreSQL源码,故记录.(这两年PostgreSQL数据库在某些环境下是比较火的,原因想必大家都清楚.) Postg ...

  9. CoaXPress 时间戳 Time Stamping

    背景 在CXP2.0之前,CXP没有定义Time Stamping时间戳的概念,但是用户对Time Stamping是有实际需求的,比如我们要对比多台设备拍摄同一个物体不同角度的照片,或者记录触发完成 ...

  10. 关于『进击的Markdown』:第二弹

    关于『进击的Markdown』:第二弹 建议缩放90%食用 众里寻他千百度,蓦然回首,Markdown却在灯火灿烂处 MarkdownYYDS! 各位早上好!  我果然鸽稿了  Markdown 语法 ...