ASP.NET CORE API Swagger+IdentityServer4授权验证

简介

本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下。

不了解IdentityServer4的可以看看我之前写的入门博文

Swagger 官方演示地址

源码地址

配置IdentityServer4服务端

首先创建一个新的ASP.NET Core项目。

这里选择空白项,新建空白项目

等待创建完成后,右键单击项目中的依赖项选择管理NuGet程序包,搜索IdentityServer4并安装:

等待安装完成后,下载官方提供的UI文件,并拖放到项目中。下载地址:https://github.com/IdentityServer/IdentityServer4.Quickstart.UI

配置IdentityServer4

在项目中新建文件Config.cs文件,源码如下:

using IdentityServer4;
using IdentityServer4.Models;
using IdentityServer4.Test;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace IdentityServer
{
    public static class Config
    {
        public static IEnumerable<IdentityResource> GetIdentityResources()
        {
            return new IdentityResource[]
            {
                new IdentityResources.OpenId(),
                new IdentityResources.Profile(),
            };
        }
        /// <summary>
        /// API信息
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<ApiResource> GetApis()
        {
            return new[]
            {
                new ApiResource("demo_api", "Demo API with Swagger")
            };
        }
        /// <summary>
        /// 客服端信息
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<Client> GetClients()
        {
            return new[]
            {
                new Client
                {
                    ClientId = "demo_api_swagger",//客服端名称
                    ClientName = "Swagger UI for demo_api",//描述
                    AllowedGrantTypes = GrantTypes.Implicit,//指定允许的授权类型(AuthorizationCode,Implicit,Hybrid,ResourceOwner,ClientCredentials的合法组合)。
                    AllowAccessTokensViaBrowser = true,//是否通过浏览器为此客户端传输访问令牌
                    RedirectUris =
                    {
                        "http://localhost:5001/swagger/oauth2-redirect.html"
                    },
                    AllowedScopes = { "demo_api" }//指定客户端请求的api作用域。 如果为空,则客户端无法访问
                }
            };
        }
    }
}

打开Startup.cs文件配置,修改如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using IdentityServer4.Quickstart.UI;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;

namespace IdentityServer
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            //配置身份服务器与内存中的存储,密钥,客户端和资源
            services.AddIdentityServer()
                   .AddDeveloperSigningCredential()
                   .AddInMemoryApiResources(Config.GetApis())//添加api资源
                   .AddInMemoryClients(Config.GetClients())//添加客户端
                   .AddInMemoryIdentityResources(Config.GetIdentityResources())//添加对OpenID Connect的支持
                   .AddTestUsers(TestUsers.Users); //添加测试用户
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //IdentityServe
            app.UseIdentityServer();
            //添加静态资源访问
            app.UseStaticFiles();
            //
            app.UseMvcWithDefaultRoute();
        }
    }
}

修改启动端口为5000,启动访问:http://localhost:5000/,效果如下:

API配置

新建ASP.NET CORE API项目,使用NuGet添加包:IdentityServer4.AccessTokenValidation、Swashbuckle.AspNetCore

在API中添加 AuthorizeCheckOperationFilter用于管理IdentityServer4认证处理,代码如下:

using Microsoft.AspNetCore.Authorization;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TPL.API
{
    /// <summary>
    /// IdentityServer4认证过滤器
    /// </summary>
    public class AuthorizeCheckOperationFilter : IOperationFilter
    {
        public void Apply(Operation operation, OperationFilterContext context)
        {
            //获取是否添加登录特性
            var authAttributes = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
             .Union(context.MethodInfo.GetCustomAttributes(true))
             .OfType<AuthorizeAttribute>().Any();

            if (authAttributes)
            {
                operation.Responses.Add("401", new Response { Description = "暂无访问权限" });
                operation.Responses.Add("403", new Response { Description = "禁止访问" });
                //给api添加锁的标注
                operation.Security = new List<IDictionary<string, IEnumerable<string>>>
                {
                    new Dictionary<string, IEnumerable<string>> {{"oauth2", new[] {"demo_api"}}}
                };
            }
        }
    }
}

修改API的Startup文件,修改如下:

using System;
using System.Collections.Generic;
using IdentityServer4.AccessTokenValidation;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Swashbuckle.AspNetCore.Swagger;

namespace TPL.API
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            //用户校验
            services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
              .AddIdentityServerAuthentication(options =>
              {
                  options.Authority = "http://localhost:5000"; // IdentityServer服务器地址
                  options.ApiName = "demo_api"; // 用于针对进行身份验证的API资源的名称
                  options.RequireHttpsMetadata = false; // 指定是否为HTTPS
              });
            //添加Swagger.
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new Info { Title = "Protected API", Version = "v1" });
                //向生成的Swagger添加一个或多个“securityDefinitions”,用于API的登录校验
                options.AddSecurityDefinition("oauth2", new OAuth2Scheme
                {
                    Flow = "implicit", // 只需通过浏览器获取令牌(适用于swagger)
                    AuthorizationUrl = "http://localhost:5000/connect/authorize",//获取登录授权接口
                    Scopes = new Dictionary<string, string> {
                        { "demo_api", "Demo API - full access" }//指定客户端请求的api作用域。 如果为空,则客户端无法访问
                    }
                });

                options.OperationFilter<AuthorizeCheckOperationFilter>(); // 添加IdentityServer4认证过滤
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseAuthentication();

            // Swagger JSON Doc
            app.UseSwagger();

            // Swagger UI
            app.UseSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
                options.OAuthClientId("demo_api_swagger");//客服端名称
                options.OAuthAppName("Demo API - Swagger-演示"); // 描述
            });
            app.UseMvc();
        }
    }
}

修改Properties文件夹下的launchSettings启动端口为5001,这里端口必须跟IdentityServer4中的Config配置的客服端资源中保持一致。

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5001",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "TPL.API": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:5001",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

访问呈现效果如下,从中效果图中可以看出添加登录按钮,API控制器中如果添加Authorize特性,对应接口会有一把锁的标志:

如果未授权访问接口返回401,未授权提示:

点击Authorize按钮会跳转到IdentityServer4登录页面,登录授权成功后会自动获取登录后服务器返回Token,再次访问接口即可正常访问,授权前后效果如下:

到此演示项目完毕。如果需求配合自己的数据库使用请看我前面写过的博文 自定义登录即可。

原文地址:https://www.cnblogs.com/miskis/p/10083985.html

时间: 2024-10-15 10:30:50

ASP.NET CORE API Swagger+IdentityServer4授权验证的相关文章

使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(二)

在 使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(1) 中,IdentityServer4 使用的是内存数据,不方便灵活,这次要把 IdentityServer4 的数据也保存到数据库中. 添加 IdentityServer4.EntityFramework IdentityServer4 有两种类型的数据需要保存数据库中.第一是配置数据(资源和客户端).第二个是 IdentityServer 在使用时产生的操作数据(令牌,代码和同意).这些存

在 Ubuntu 16.04 上的 ASP.NET Core 应用开发04:使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器

新建 ASP.NET Core Identity 项目 在新建ASP.NET Core Web 应用程序 窗口中分别选择:ASP.NET Core 2.0,Web应用程序(模型视图控制器)和个人用户账号 项目建立后, 运行方式改为使用控制台运行而不是IISExpress, 以便查看各种debug信息. 打开launchSettings.json: { "profiles": { "IdentityManagerServer": { "commandName

详解ASP.NET Core API 的Get和Post请求使用方式

原文:详解ASP.NET Core API 的Get和Post请求使用方式 上一篇文章帮助大家解决问题不彻底导致博友使用的时候还是遇到一些问题,欢迎一起讨论.所以下面重点详细讲解我们常用的Get和Post请求( 以.net core2.2的Http[Verb]为方向 ,推荐该属性路由),如果想验证,直接利用VS2017创建ASP.NET Core API (.net core 2.2),在DefaultController里面操作.文中有些关键字,我是加了粗的,请注意一下. 帮助回忆,Get和P

asp.net core api网关 实时性能监控

asp.net core api网关 实时性能监控 使用InfluxDB.Grafana Dockerfile 运行 InfluxDB.Grafana influxdb: image: influxdb ports: - "8086:8086" - "8083:8083" environment: - INFLUXDB_DB=TogetherAppMetricsDB - INFLUXDB_ADMIN_ENABLED=true - INFLUXDB_ADMIN_USE

ASP.NET Core API 接收参数去掉烦人的 [FromBody]

在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody]属性才获取到.但是我看微软官方文档演示代码中并没有添加[FromBody],难道是微软官方文档写错了,按道理应该不会.Google里看到一片篇文章里的一个细节,又追回微软官方文档发现可行,于是记下去掉这个烦人的[FromBody]过程 修改之前测试 后台通过Visual Studio生成ASP.N

ASP.NET Core API总结(一)

ASP.NET Core API 问题:当应用收到一个http请求之后,API应用程序是怎么一步步执行的. 注册服务——构造容器——使用服务——创建对象 1.         创建一个新的API之后,properties下面会自动生成这个json文件. 2.         第一步:应用启动的时候,在program.cs文件中执行main函数,进行创建主机.(加载配置文件)——指定Startup类(1.配置应用服务.2.创建请求处理管道) 3.         第二步:执行到Startup类的时

ASP.NET Core API ——Dapper的使用

ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l  创建一个IDBConnection的接口对象 l  编写Sql语句的增删改查 l  执行Execute方法 1.       提供一个IDBConnection接口对象 2.       在DB仓库中继承抽象类从而获取IDBConnection对象.继承了抽象类,所以抽象类中的属性可以在子类中使用. 3.       编写Sql语句,使用dapper的

Asp.Net Core Api 使用Swagger管理文档教程的安装与使用

这周因为公司的需求需要我做一个Api的程序,这周的三天时间我一直在Core Api和 framework Api之间做纠结.不知道要使用哪一个去做项目,想着想着就决定了.既然两个我都没用过那个何不来使用Core Api来做呢.也是对自己的一种锻炼! OK,接下来回归正题! Core下的Swagger和传统framework  Mvc下的Swagger是不一样的!  两者的差距:       其一:引用的程序集不一样.          其二:安装完程序集后需要配置的地方不一样,        

Asp.Net Core webApi Swagger 配置说明

概要在官网上很容 可以找到开启Swagger Gen 的配置信息,这也是我们快速开发 Api 的开始使得我们不用写API 的文档和测试了 .理想很丰满,但在使用时我们 部分Get 接口可以用了但是我们Post 时候需要我们做 身份验证了,Token 是不错的选择.这也是.我学习Swagger ,不精的问题.怎么开启身份认证?. 进入正题 我把我用到的所有代码黏贴出来:一个个的说: Swagger 注册: services.AddSwaggerGen(c => { c.OperationFilte