zoukankan      html  css  js  c++  java
  • swaggerui集成oauth implicit

    swaggerui集成oauth implicit

    添加引用
    Swashbuckle.AspNetCore
    IdentityServer4.AccessTokenValidation

    预先准备好IdentityServer4配置client与Api Resources
    Startup 配置 Authentication Api Resources 和SwaggerUI Client配置

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(option =>
        {
            option.Filters.Add(typeof(ActionFilter));
            option.Filters.Add(typeof(ExceptionFilter));
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        string youAuthority = "http://127.0.0.1";
        services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = youAuthority;
                options.ApiName = "Api";
                options.RequireHttpsMetadata = false;
            });
    
        services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info { Title = "Test Service API", Version = "v1" });
            options.DocInclusionPredicate((docName, description) => true);
            options.CustomSchemaIds(type => type.FullName);
    
            options.AddSecurityDefinition("oauth2", new OAuth2Scheme
            {
                Type = "oauth2",
                Flow = "implicit",
                AuthorizationUrl = $"{youAuthority}/connect/authorize",
                TokenUrl = $"{youAuthority}/connect/token",
                Scopes = new Dictionary<string, string>()
                {
                    { "scope", "定义的scope" }  //Api Resources 中的 scope
                }
            });
    
            options.OperationFilter<AuthResponsesOperationFilter>();
        });
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseAuthentication();
        app.UseMiddleware<FirstMiddleware>();
    
        app.UseMvc();
        
        app.UseSwagger().
            UseSwaggerUI(options =>![](https://img2018.cnblogs.com/blog/355798/201903/355798-20190328201652364-1689226610.png)
    
            {
                options.SwaggerEndpoint("/swagger/v1/swagger.json", "Test Service API");
                //支持 implicit 的 Client
                options.OAuthClientId("swaggerui");
                options.OAuthAppName("Test Service Swagger Ui");
            });
    }
    

    对有鉴权属性的方法添加请求时传递token和添加预设返回状态

    public class AuthResponsesOperationFilter : IOperationFilter
    {
        public void Apply(Operation operation, OperationFilterContext context)
        {
            // 反射Controller 包含 AuthorizeAttribute 时在请求头添加authorization: Bearer 
            var controllerScopes = context.ApiDescription.ControllerAttributes()
                .OfType<AuthorizeAttribute>()
                .Select(attr => attr.Policy);
    
            var actionScopes = context.MethodInfo
                .GetCustomAttributes(true)
                .OfType<AuthorizeAttribute>()
                .Select(attr => attr.Policy)
                .Distinct();
    
            var requiredScopes = controllerScopes.Union(actionScopes).Distinct();
    
            if (requiredScopes.Any())
            {
                operation.Responses.Add("401", new Response { Description = "Unauthorized" });
                operation.Responses.Add("403", new Response { Description = "Forbidden" });
    
                operation.Security = new List<IDictionary<string, IEnumerable<string>>>();
                operation.Security.Add(new Dictionary<string, IEnumerable<string>>
                {
                    { "oauth2", requiredScopes }
                });
            }
        }
    }
    

    在 Action 上添加 Authorize

    [HttpGet("{id}")]
    [Authorize]
    public ActionResult<string> Get(int id)
    {
        return "value";
    }
    

    效果图

    //新增的两种返回状态
    operation.Responses.Add("401", new Response { Description = "Unauthorized" });
    operation.Responses.Add("403", new Response { Description = "Forbidden" });
    

    登录完后请求会带上authorization: Bearer

    示例代码
    Swashbuckle.AspNetCore

  • 相关阅读:
    深度讲解Go语言-学习笔记
    vagrant常用命令
    CentOS7 安装Python虚拟环境 virtualenvwrapper
    《Android开发艺术探索》读书笔记——Cha3.2.3改变布局参数实现View的滑动
    Map接口的实现类 Map的区别
    Java多线程之内存可见性和原子性操作 一 synchronized
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 64. Minimum Path Sum
    实现线程同步的几种方式
    IOC的底层原理
  • 原文地址:https://www.cnblogs.com/ddrsql/p/10617370.html
Copyright © 2011-2022 走看看