Asp.net web api 招摇过市用户界面:传递自定义授权标头

Asp.net web api 招摇过市用户界面:传递自定义授权标头,asp.net-web-api,swagger,swagger-ui,swashbuckle,Asp.net Web Api,Swagger,Swagger Ui,Swashbuckle,我正在ASP.NETWebAPI上使用Swashback和Swagger。我试图找到一种方法,通过Swagger UI传递包含承载令牌的授权头。我一直在四处寻找,但所有的答案似乎都指向链接 但是,这假设头的内容是预先知道的。我真的需要一种方法来更改Swagger UI中的标题(在点击“试用!”按钮之前),因为承载令牌每小时过期一次。类似于Postman允许您添加标题的方式 这似乎是一个非常简单的问题,但答案是什么呢?根据收集授权标题的方式,以及您是否希望代码处理所有内容,或者您是否希望用户能够输

我正在ASP.NETWebAPI上使用Swashback和Swagger。我试图找到一种方法,通过Swagger UI传递包含承载令牌的授权头。我一直在四处寻找,但所有的答案似乎都指向链接

但是,这假设头的内容是预先知道的。我真的需要一种方法来更改Swagger UI中的标题(在点击“试用!”按钮之前),因为承载令牌每小时过期一次。类似于Postman允许您添加标题的方式


这似乎是一个非常简单的问题,但答案是什么呢?

根据收集
授权
标题的方式,以及您是否希望代码处理所有内容,或者您是否希望用户能够输入他们想要的
授权
标题,您可以采用不同的方式来完成

当我第一次尝试此操作时,我能够在每个端点的参数字段区域中显示
授权
标题文本,用户可以在其中键入
授权
标题,但这不是我想要的

在我的情况下,我必须使用用户的cookie向
/token
端点发送请求,以获得有效的
授权
令牌。所以我做了很多事情来达到这个目的

首先,在
SwaggerConfig.cs
中,我取消了
c.BasicAuth()
的注释,以将基本身份验证方案放入API模式,并且我还插入了一个自定义
index.html
页面,在该页面中,我插入了一个AJAX请求,以便使用用户的cookie(
index.html
代码,如下所示)获取
Authorization
令牌:

然后前往下载Swashback
index.html
,我们将对其进行定制,以插入
授权
标题

下面,我只需使用有效的cookie对我的
/token
端点进行AJAX调用,获取
授权
令牌,并将其交给swagger与
window.swaggerUi.api.clientAuthorizations.add()一起使用:

我从AJAX调用中删除了一些内容,使其更加简单,显然,您的实现可能会有所不同,这取决于您如何收集
授权
令牌和其他内容,但这给了您一个想法。如果您有任何具体问题,请告诉我

*编辑:没有注意到您确实希望用户键入其
授权
标题。那样的话就很容易了。我用过邮局。只需创建以下类即可完成此工作:

public class AddRequiredHeaderParameter : IOperationFilter {

    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) {
        if (operation.parameters == null) {
            operation.parameters = new List<Parameter>();
        }

        operation.parameters.Add(new Parameter {
            name = "Foo-Header",
            @in = "header",
            type = "string",
            required = true
        });
    }
}

我们在项目中遇到了同样的问题。我还想向Swagger UI网站添加标题参数。我们就是这样做的:

1。定义操作筛选器类 每次构建Swagger时,都会对每个API操作执行OperationFilters。根据您的代码,将根据过滤器检查操作。在本例中,我们将header参数设置为每个操作都需要,但将其设置为具有AllowAnonymous属性的操作的可选参数

公共类AddAuthorizationHeader:IOperationFilter
{
/// 
///向Swagger中的给定操作添加授权标头。
/// 
///虚张声势的行动。
///Swashback模式注册表。
///虚张声势的api描述。
public void Apply(操作,SchemaRegistry SchemaRegistry,apisdescription apisdescription)
{
if(operation==null)返回;
if(operation.parameters==null)
{
operation.parameters=新列表();
}
var参数=新参数
{
description=“授权令牌”,
@in=“header”,
name=“授权”,
必需=真,
type=“string”
};
if(apisdescription.ActionDescriptor.GetCustomAttributes().Any())
{
parameter.required=false;
}
操作.参数.添加(参数);
}
}
2。告诉斯威格使用此操作过滤器 在SwaggerConfig中,只需添加操作筛选器,如下所示:

c.操作过滤器();

希望这对你有帮助

创建实现
IOperationFilter
的新操作筛选器

公共类授权HeaderOperationFilter:IOperationFilter
{
/// 
///向Swagger中的给定操作添加授权标头。
/// 
///虚张声势的行动。
///Swashbuckle操作筛选器上下文。
公共无效应用(操作,操作筛选器上下文)
{
if(operation.Parameters==null)
{
operation.Parameters=newlist();
}
var authorizeAttributes=context.apiscription
.政府官员
.Union(context.apiscription.ActionAttributes())
.of type();
var allowAnonymousAttributes=context.apisdescription.ActionAttributes().OfType();
如果(!authorizeAttributes.Any()&&!allowAnonymousAttributes.Any())
{
返回;
}
var参数=新的非主体参数
{
Name=“授权”,
In=“header”,
Description=“承载令牌”,
必需=真,
Type=“string”
};
操作.参数.添加(参数);
}
}
Startup.cs
文件中配置服务

services.ConfigureSwaggerGen(选项=>
{
options.OperationFilter();
});

在Swashbuckle 5中,这是在
Startup.cs
中使用以下文件完成的

//注册招摇过市生成器,定义一个或多个招摇过市文档
services.AddSwaggerGen(c=>
{
c、 阿德斯库
...

function log() {
  if ('console' in window) {
    console.log.apply(console, arguments);
  }
}

$.ajax({
    url: url + 'token'
  , type: 'POST'
  , data: { 'grant_type': 'CustomCookie' }
  , contentType: 'application/x-www-form-urlencoded'
  , async: true
  , timeout: 60000
  , cache: false
  , success: function(response) {
        console.log('Token: ' + response['token_type'] + ' ' + response['access_token']);
        window.swaggerUi.api.clientAuthorizations.add("key", new SwaggerClient.ApiKeyAuthorization("Authorization", response['token_type'] + ' ' + response['access_token'], "header"));
    }
  , error: function(request, status, error) {
        console.log('Status: ' + status + '. Error: ' + error + '.');
    }
});
public class AddRequiredHeaderParameter : IOperationFilter {

    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) {
        if (operation.parameters == null) {
            operation.parameters = new List<Parameter>();
        }

        operation.parameters.Add(new Parameter {
            name = "Foo-Header",
            @in = "header",
            type = "string",
            required = true
        });
    }
}
...
c.OperationFilter<AddRequiredHeaderParameter>();
...