Asp.net web api 全局授权筛选器不适用于Swagger UI Asp.net Web Api

Asp.net web api 全局授权筛选器不适用于Swagger UI Asp.net Web Api,asp.net-web-api,authorization,swagger-ui,swashbuckle,Asp.net Web Api,Authorization,Swagger Ui,Swashbuckle,我正在用我的Asp.net WEB Api项目实现,我正在使用默认的System.WEB.Http.AuthorizeAttribute,我已经在WebApiConfig.cs的Register方法中将其注册为 config.Filters.Add(new AuthorizeAttribute()); 我已经将Swagger UI实现为 public static void Register() { var thisAssembly = typeof(SwaggerConfig).Asse

我正在用我的Asp.net WEB Api项目实现,我正在使用默认的
System.WEB.Http.AuthorizeAttribute
,我已经在
WebApiConfig.cs
Register
方法中将其注册为

 config.Filters.Add(new AuthorizeAttribute());
我已经将Swagger UI实现为

public static void Register()
{
 var thisAssembly = typeof(SwaggerConfig).Assembly;

 GlobalConfiguration.Configuration
 .EnableSwagger(c =>
 {
    c.SingleApiVersion("v1", "COE.Services.WebAPI");

    c.OAuth2("oauth2")
    .Description("OAuth2 Implicit Grant")
    .Flow("implicit")
    .AuthorizationUrl(configurationService.BaseWithTokenUrl)
    .Scopes(scopes =>
    {
        scopes.Add("user_scope", "Access REST API");
    });

    c.OperationFilter<AssignOAuth2SecurityRequirements>();
})
.EnableSwaggerUi(c =>
{
    c.EnableOAuth2Support("COEApi", configurationService.BaseUrl + "swagger/ui/o2c-html", "Swagger");
});
}     

 public class AssignOAuth2SecurityRequirements : IOperationFilter
 {
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        var toBeAuthorize = apiDescription.GetControllerAndActionAttributes<AuthorizeAttribute>().Any();
        var allowAnonymous = apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();

        if (toBeAuthorize && !allowAnonymous)
        {
            if (operation.parameters == null)
                operation.parameters = new List<Parameter>();

            operation.parameters.Add(new Parameter()
            {
                name = "Authorization",
                @in = "header",
                description = "Bearer <token>",
                required = true,
                type = "string"
            });
        }
    }
}
公共静态无效寄存器()
{
var thissassembly=typeof(SwaggerConfig).Assembly;
全局配置
.EnableSwagger(c=>
{
c、 SingleAPI版本(“v1”、“COE.Services.WebAPI”);
c、 OAuth2(“OAuth2”)
.说明(“OAuth2隐式授权”)
.Flow(“隐式”)
.AuthorizationUrl(configurationService.BaseWithTokenUrl)
.Scopes(Scopes=>
{
添加(“用户范围”、“访问RESTAPI”);
});
c、 操作筛选器,但我找不到任何解决方案


我在Swashback中遇到的Swagger API和UI与路由的HttpMessageHandler一样。因此过滤器在那里不起作用(因为它们只适用于ASP.NET WebAPI的控制器和操作)

但是,您可以以不同的方式防止对swagger的未授权访问。如果您使用ASP.NET Web API作为Owin中间件(通过使用nuget软件包),那么您可以编写简单的中间件,并将其放在swagger中间件之前,以拒绝对“swagger/docs/”和“swagger/ui/”的请求(swagger API和ui的默认路由)

例如:

[程序集:OwinStartupAttribute(typeof(WebApplicationMvcWebApiSwagger.Startup))]
名称空间WebApplicationMvcWebApiSwagger
{
公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
ConfigureAuth(app);
app.userejectUnahorizedUsersForsWagger();
var config=新的HttpConfiguration();
配置
.EnableSwagger(c=>
{
c、 单一API版本(“v1”,“API的标题”);
})
.EnableSwaggerUi();
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
app.UseWebApi(配置);
}
}
公共静态类SwaggerAuthorizationMiddleware
{
public static void userejectUnahorizedUsersForsWagger(此IAppBuilder appBuilder)
{
appBuilder.Use((上下文,下一步)=>
{
if(context.Request.Path.Value.StartsWith(“/swagger/docs/”)
||context.Request.Path.Value.StartsWith(“/swagger/ui/”)
{
var user=(context.Request.user作为ClaimsPrincipal);
if(user==null | |!user.Identity.IsAuthenticated)
{
context.Response.StatusCode=401;
context.Response.ContentType=“text/plain”;
返回context.Response.WriteAsync(“Unauthorized.Log in to use swagger.”);
}
}
返回next.Invoke();
});
}
}
}
ConfigureAuth(app)
是一个负责身份验证的中间件(此处由使用ASP.NET标识的Visual Studio模板生成)。在身份验证中间件之后和WebApi中间件之前(还添加了swagger),您可以使用自定义身份验证逻辑放置自己的中间件

如果您没有将Owin用于ASP.NET API,那么您可以尝试实现
HttpMessageHandler
,并添加类似于前面Owin中间件示例中的逻辑。您应该能够使用来获取授权数据(或者在IIS中托管时?我不确定):

受保护的无效应用程序\u Start()
{
//...
GlobalConfiguration.Configure(WebApiConfig.Register);
//...
}
config.MessageHandlers.Add(新的requireReadMinUserForSwagerDocanDuiHandler());
配置
.EnableSwagger(c=>
{
c、 单一API版本(“v1”,“API的标题”);
})
.EnableSwaggerUi();
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
WaggerDocAndUIHandler的公共类RequiredMinUserr:DelegatingHandler
{
异步保护覆盖任务SendAsync(
HttpRequestMessage请求,CancellationToken CancellationToken)
{
if(request.RequestUri.PathAndQuery.StartsWith(“/swagger/docs/”)
||request.RequestUri.PathAndQuery.StartsWith(“/swagger/ui/”)
{
if(Thread.CurrentPrincipal==null | |!Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
var response=新的HttpResponseMessage();
response.StatusCode=System.Net.HttpStatusCode.Unauthorized;
response.Content=newstringcontent(“未经授权。请登录以使用swagger”);
返回响应;
}
}
返回wait base.sendaync(请求、取消令牌);
}
}