• 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

  • 相关阅读:
    样条之CatmullRom
    分形之树(Tree)
    B样条
    样条之贝塞尔(Bezier)
    插值与样条
    windows 下的Python虚拟环境(vitrualen)pycharm创建Django项目
    VS2010专业版和旗舰版(中文版)下载
    PHP课程环境安装总结文档
    原码、反码、补码知识详细讲解(此作者是我找到的讲的最细最明白的一个)
    C语言中size_t类型详细说明【转载】
  • 原文地址:https://www.cnblogs.com/ddrsql/p/10617370.html
Copyright © 2020-2023  润新知