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 -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 -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/ 

相关文章: 

  • Thinktecture IdentityServer:.NET开源OpenID和OAuth解决方案

  • 教你实践ASP.NET Core Authorization(免看文档教程)

原文地址:http://www.cnblogs.com/linezero/p/IdentityServer4.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA多线程总结(笔记)

线程的特点 线程就是独立的执行路径&#xff1b;在线程运行时&#xff0c;即使没有自己创建线程&#xff0c;后台也会有多个线程&#xff0c;如主线程&#xff0c;gc线程&#xff1b;main()称之为主线程&#xff0c;为系统的入口&#xff0c;用于执行整个程序&#xff1b;在一…

很有道理的内容

男生选女朋友最看重的是什么? 病毒营销陈轩 被赞同30万&#xff0c;被收藏24万&#xff0c;顶级病毒营销专家&#xff0c;加个人微信送书 12,540 人也赞同了该回答 有女孩给我发私信&#xff1a; “我是个很好的女孩&#xff0c;漂亮身材好&#xff0c;白领一枚&#xff0c…

学python后做什么工作好_学习完Python课程后可以做什么工作?

Python作为人工智能、大数据的首选编程语言&#xff0c;也是进入编程世界的理想选择&#xff0c;已经成为了大家都在追求学习的语言&#xff0c;那么学习Python之后到底可以做什么呢?为您详细的介绍一下。什么是Python?Python是一种面向对象解释型计算机程序设计语言。而且Py…

vue-beauty 的v-data-table数据单元不换行

原因由于css样式 .ant-table-tbody>tr>td, .ant-table-thead>tr>th {padding: 16px 8px;word-break: keep-all;white-space: nowrap; /*强制不换行*/ } 只需覆盖white-space的值就可以 如&#xff1a; .ant-table-tbody>tr>td {white-space:normal } 补…

用Middleware给ASP.NET Core Web API添加自己的授权验证

Web API&#xff0c;是一个能让前后端分离、解放前后端生产力的好东西。不过大部分公司应该都没能做到完全的前后端分离。API的实现方式有很 多&#xff0c;可以用ASP.NET Core、也可以用ASP.NET Web API、ASP.NET MVC、NancyFx等。说到Web API&#xff0c;不同的人有不同的做法…

公司电脑重装经验 ThinkPad E480 win7重装 电脑重装

***************************下面是20200813更新的****************************** 1.电脑的机械盘老是掉线 要重启才能找到 不用了 还是用自己的移动硬盘代替公司的D盘吧 拷贝也很慢 2.公司的c盘菜120G太小 就只安装必须使用的软件 外接移动硬盘代替电脑的D盘 可以用…

Java 内存泄露以及避免方法

转载自 Java 内存泄露以及避免方法 内存泄露: 是指在程序运行过程中会不断的分配内存空间&#xff0c;那些不再使用的内存空间应该即时回收它们&#xff0c;从而保证可以保证系统可以再次使用这些内存。如果存在无用的内存没有被收回来&#xff0c;那就是内存泄露。 说明…

Tomacat乱码解决

解决方法 解决后

体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景

说到队列的话&#xff0c;大家一定不会陌生&#xff0c;但是扯到优先级队列的话&#xff0c;还是有一部分同学是不清楚的&#xff0c;可能是不知道怎么去实现吧&#xff0c;其实呢&#xff0c;&#xff0c;&#xff0c;这东西已经烂大街了。。。很简单&#xff0c;用“堆”去实…

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

转载自 jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令 1&#xff0e;Jstack 1.1 jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示 注&#xff1a;这个和thread dump是同样的结果。但是thread dump是用ki…

RabbitMQ消息队列应用

消息通信组件Net分布式系统的核心中间件之一&#xff0c;应用与系统高并发&#xff0c;各个组件之间解耦的依赖的场景。本框架采用消息队列中间件主要应用于两方面&#xff1a;一是解决部分高并发的业务处理&#xff1b;二是通过消息队列传输系统日志。目前业界使用较多的消息队…

vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!

回答范例&#xff1a;vuex是vue专用的状态管理库。它以全局方式集中管理应用的状态&#xff0c;并且可以保证状态变更的可预测性。vuex主要解决的问题是多组件之间状态共享的问题&#xff0c;利用各种组件通信方式&#xff0c;我们虽然能够做到状态共享。但是往往需要在多个组件…

常用数据库连接串与驱动总结

1、sql server驱动com.microsoft.sqlserver.jdbc.SQLServerDriver//sql验证jdbc:sqlserver://127.0.0.1:1433;databasenamemydb;Usersa;Password1712682、oracle驱动oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:127.0.0.1:1521:orcl3、mysql驱动com.mysql.jdbc.Driverjdb…

Mysql8.0可以使用解压版 这个比较快 好像现在都是解压版了

https://blog.csdn.net/Charonmomo/article/details/98440968 MySQL-mysql 8.0.17安装 2019年08月04日 09:59:12 Charonmomo 阅读数 1654 标签&#xff1a; MySQL 更多 个人分类&#xff1a; MySQL 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 by-sa 版…

公式冒号是什么意思_三角学中,这么一堆公式其实就说了2个事而已

[遇见数学创作小组] 作者: 心如止水(Java程序员。善于把复杂的数学知识&#xff0c;简洁易懂地表达出来)在学三角这部分的时候&#xff0c;有些书习惯列出诱导公式(induction formula)&#xff0c;都列出来的话可以写小半张纸。那什么是“诱导公式”呢&#xff1f;“诱导公式”…

.NET Core开发:项目实践

初始化项目 本来想详细讲一讲dotnet core的&#xff0c;但我对于dotnet core的研究还不到一星期&#xff0c;半吊子&#xff0c;脑子又笨&#xff0c;就不写那些理论出来误人子弟了&#xff0c;还是直接来一篇实践给大家做个参考。废话不多说&#xff0c;直接上项目&#xff0c…

如何使用jstack分析线程状态

转载自 如何使用jstack分析线程状态背景 记得前段时间&#xff0c;同事说他们测试环境的服务器cpu使用率一直处于100%&#xff0c;本地又没有什么接口调用&#xff0c;为什么会这样&#xff1f;cpu使用率居高不下&#xff0c;自然是有某些线程一直占用着cpu资源&#xff0c;那…

JAVA网络编程实战(笔记)

计算机网络简介 网络编程的目的&#xff1a; 无限电台。。。。传播交流信息&#xff0c;数据交换。通信 想要达到这个效果需要什么&#xff1a; 1.如何准确的定位网络上的一台主机 ip地址192.168.16.124&#xff1a; 端口&#xff0c;定位到这个计算机上的某个资源 2.找到…

让 Java 应用运行更快:性能调优工具及实践

转载自 让 Java 应用运行更快&#xff1a;性能调优工具及实践Java 应用性能优化是一个老生常谈的话题&#xff0c;笔者根据个人经验&#xff0c;将 Java 性能优化分为 4 个层级&#xff1a;应用层、数据库层、框架层、JVM 层。通过介绍 Java 性能诊断工具和思路&#xff0c;给…