Asp.net web api 招摇过市用户界面:传递自定义授权标头
我正在ASP.NETWebAPI上使用Swashback和Swagger。我试图找到一种方法,通过Swagger UI传递包含承载令牌的授权头。我一直在四处寻找,但所有的答案似乎都指向链接 但是,这假设头的内容是预先知道的。我真的需要一种方法来更改Swagger UI中的标题(在点击“试用!”按钮之前),因为承载令牌每小时过期一次。类似于Postman允许您添加标题的方式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允许您添加标题的方式 这似乎是一个非常简单的问题,但答案是什么呢?根据收集授权标题的方式,以及您是否希望代码处理所有内容,或者您是否希望用户能够输
这似乎是一个非常简单的问题,但答案是什么呢?根据收集
授权
标题的方式,以及您是否希望代码处理所有内容,或者您是否希望用户能够输入他们想要的授权
标题,您可以采用不同的方式来完成
当我第一次尝试此操作时,我能够在每个端点的参数字段区域中显示授权
标题文本,用户可以在其中键入授权
标题,但这不是我想要的
在我的情况下,我必须使用用户的cookie向/token
端点发送请求,以获得有效的授权
令牌。所以我做了很多事情来达到这个目的
首先,在SwaggerConfig.cs
中,我取消了c.BasicAuth()
的注释,以将基本身份验证方案放入API模式,并且我还插入了一个自定义index.html
页面,在该页面中,我插入了一个AJAX请求,以便使用用户的cookie(index.html
代码,如下所示)获取Authorization
令牌:
然后前往下载Swashbackindex.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>();
...