IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API。
使用IdentityServer4 来实现使用客户端凭据保护ASP.NET Core Web API 访问。
IdentityServer4 GitHub: https://github.com/IdentityServer/IdentityServer4
IdentityServer 框架支持以下功能:
身份验证服务
所有应用程序(Web,本机,移动,服务)的集中登录逻辑和工作流。
单点登录/退出
对多种应用程序类型的单点登录和退出。
API的访问控制
针对各种类型的客户发出针对API的访问令牌,例如服务器到服务器,Web应用程序,SPA和本机/移动应用程序。
联合登录
支持外部身份提供程序,如Azure Active Directory,Google,Facebook等。
专注于定制
IdentityServer最重要的部分 - 许多方面可以定制,以满足你的需要。由于IdentityServer是一个框架,而不是一个封闭产品或SaaS,你可以编写代码,使你的系统适应对应的场景。

IdentityServer实现了以下规范:
OpenID Connect
OpenID Connect Core 1.0
OpenID Connect Discovery 1.0
OpenID Connect Session Management 1.0 - draft 22
OpenID Connect HTTP-based Logout 1.0 - draft 03
OAuth 2.0
OAuth 2.0 (RFC 6749)
OAuth 2.0 Bearer Token Usage (RFC 6750)
OAuth 2.0 Multiple Response Types
OAuth 2.0 Form Post Response Mode
OAuth 2.0 Token Revocation (RFC 7009)
OAuth 2.0 Token Introspection (RFC 7662)
Proof Key for Code Exchange (RFC 7636)
主要讲解 使用客户端凭据保护API 。如何保证的你的API 不被其他人擅自访问?
下面开始正式的实例。
新建ASP.NET Core项目及引用IdentityServer4
首先新建一个ASP.NET Core项目IdentityServer4Demo,然后选择 空 模板。

然后添加引用。
NuGet命令行:
Install-Package IdentityServer4 -Version 1.0.0-rc2 -Pre
IdentityServer4使用
添加好引用以后我们就可以来使用了。
首先创建一个 Config.cs 类。
定义范围:
public static IEnumerable<Scope> GetScopes()
{
return new List<Scope>
{
new Scope
{
Name = "zeroapi",
Description = "LineZero ASP.NET Core Web API"
}
};
}
定义客户端:
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "linezeroclient", //使用clientid / secret进行身份验证
AllowedGrantTypes = GrantTypes.ClientCredentials, // 加密验证
ClientSecrets = new List<Secret>
{
new Secret("secret".Sha256())
}, // client可以访问的范围,在上面定义的。
AllowedScopes = new List<string>
{
"zeroapi"
}
}
};
}
定义好以后,在Startup.cs 中 配置IdentityServer4
public void ConfigureServices(IServiceCollection services)
{
services.AddDeveloperIdentityServer()
.AddInMemoryScopes(Config.GetScopes())
.AddInMemoryClients(Config.GetClients());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseIdentityServer();
}
然后我们启动IdentityServer4Demo
访问:http://localhost:5000/.well-known/openid-configuration

IdentityServer 创建成功。
新建WebAPI项目

然后添加引用。
NuGet命令行:
Install-Package IdentityServer4.AccessTokenValidation -Version 1.0.1-rc2 -Pre
首先更改API 的URL地址,不和Server 重复。
这里改为 http://localhost:5001
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseUrls("http://localhost:5001")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build(); host.Run();
}
然后在Startup.cs 中 配置相关信息
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = "http://localhost:5000",
ScopeName = "zeroapi", RequireHttpsMetadata = false
}); app.UseMvc();
}
注意:这里定义的授权地址是 http://localhost:5000
下面我们来定义API,添加一个Web API 控制器 ClientController
[Route("api/[controller]")]
[Authorize]
public class ClientController : Controller
{
[HttpGet]
public IActionResult Get()
{
return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
}
}
上面添加了 Authorize 特性,直接访问API 是无法访问的。
程序启动以后,访问http://localhost:5001/api/client 会返回401 。
客户端调用
创建一个客户端调用,添加一个控制台程序 Client。
首先也要添加引用:
NuGet命令行:
Install-Package IdentityModel
客户端代码如下:
public static void Main(string[] args)
{
//访问授权服务器获取token
var disco = DiscoveryClient.GetAsync("http://localhost:5000").Result;
var tokenClient = new TokenClient(disco.TokenEndpoint, "linezeroclient", "secret");
var tokenResponse = tokenClient.RequestClientCredentialsAsync("zeroapi").Result;
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
} Console.WriteLine(tokenResponse.Json);
Console.WriteLine("==============================");
//设置token 访问API
var client = new HttpClient();
client.SetBearerToken(tokenResponse.AccessToken); var response = client.GetAsync("http://localhost:5001/api/client").Result;
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
} var content = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(content);
Console.ReadKey();
}
然后开始一个个运行。
首先启动 IdentityServer4Demo,然后API 然后Client。

Client 成功访问 API 。使用客户端凭据保护API 到这里就基本完成。
更多IdentityServer4信息:https://identityserver4.readthedocs.io/
最后更新于2016-11-07: 本文编写于RC2 版本。RC3版已更新,详细请查看官方文档。
如果你觉得本文对你有帮助,请点击“推荐”,谢谢。
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API的更多相关文章
- 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3
今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...
- asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- 【转】asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...
- asp.net core 从 3.1 到 5.0
asp.net core 从 3.1 到 5.0 Intro 就在前几天,微软宣布了 .NET5 发布了 RC1 版本,这也意味着 .NET5 的开发基本稳定了,正式发布之前,不会再新增新的 Feat ...
- 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性
本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...
- ASP.NET Core的身份认证框架IdentityServer4(9)-使用OpenID Connect添加用户认证
OpenID Connect OpenID Connect 1.0是OAuth 2.0协议之上的一个简单的身份层. 它允许客户端基于授权服务器执行的身份验证来验证最终用户的身份,以及以可互操作和类似R ...
- IdentityServer4(9)- 使用OpenID Connect添加用户身份验证(implicit)
本文为 OpenID Connect 简化模式(implicit) 已更新至.NET Core 2.2 在本快速入门中,我们希望通过 OpenID Connect 协议向我们的 IdentitySer ...
- ASP.NET Core分布式项目-2.oauth密码模式identity server4实现
源码下载 这里根据<ASP.NET Core分布式项目-1.IdentityServer4登录中心>的代码来继续更新oauth密码模式,这里的密码模式比上次的客户端模式更安全 在WebAp ...
随机推荐
- js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...
- 修改eclipse皮肤
习惯了vim黑色背景的程序猿们想必用eclipse时会倍感的不适应吧,不过没关系,因为eclipse的皮肤是可以自己定制的! 下面是我电脑上的eclipse界面,看到这个是不是找回了vim的感觉呢? ...
- ASP.NET Core 中文文档目录
翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先生的群中发布了翻译计划招募信息,并召 ...
- HttpPost过程中使用的URLEncoder.encode(something, encode)
URLEncoder.encode("刘美美", "utf-8").toString() = %E5%88%98%E7%BE%8E%E7%B ...
- vim环境变量配置、背景色配置
我们使用vi或者vim的时候,如果想要显示行号,可能会这样做:切换到命令模式,然后输入set nu,再按回车键就显示了:还有就是咱们在编写程序的时候,有的时候会希望按下回车键后,光标不是每次都在行首, ...
- windows系统路径环境变量
当前系统盘符%systemdrive%或%HOMEDRIVE%C:\ 当前系统目录%systemroot%或%Windir%C:\WINDOWS 当前用户文件夹%UserProfile%或%HOMEP ...
- win10安装blueCFD
blueCFD其实安装起来听简单,不过还是有点问题.最大的问题是该软件没有文档,不过想来也是,人家只是提供一个linux外壳,剩下的工作还是OpenFoam,该干嘛干嘛,也用不着文档.问题在于我们需要 ...
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- 第14章 Linux启动管理(1)_系统运行级别
1. CentOS 6.x 启动管理 (1)系统运行级别 ①运行级别 运行级别 含义 0 关机 1 单用户模式,可以想象为Windows的安全模式,主要用于系统修复.(但不是Linux的安全模式) 2 ...
- VS2013中的MVC5模板部署到mono上的艰辛历程
部署环境:CentOS7 + Mono 3.10 + Jexus 5.6 在Xamarin.Studio创建的asp.net项目,部署过程非常顺利,没有遇到什么问题:但在VS2013中创建的asp.n ...