我们在WebAPI应用程序中使用令牌认证。每个调用(获取密钥的其他方法)都使用相同的模式。
Authorization: our-token v01544b7dce-95c1-4406-ad4d-b29202d0776c
我们使用Attribute
和IActionFilter
控制器看起来像这样:
[RoutePrefix("api/tms/auth")]
public class AuthController : BaseController
{
public ISecurityService SecurityService { get; set; }
[TokenAuth]
[Route("logout")]
[HttpPost]
public HttpResponseMessage Logout()
{
try
{
this.SecurityService.InvalidateAccessToken(this.StaticContextWrapperService.AccountId, token, HttpContext.Current.Request.UserHostAddress);
// Return OK status
return new HttpResponseMessage(HttpStatusCode.OK);
}
catch (LoginException le)
{
return this.LogoutFailureResponse(le.Message);
}
}
private HttpResponseMessage LogoutFailureResponse(string message)
{
return new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content = new StringContent(message, Encoding.UTF8, "text/plain")
};
}
}
Swagger配置具有以下内容:
c.ApiKey("our-token", "header", "Our Token Authentication");
Swagger UI显示“授权”按钮,我可以将令牌粘贴到弹出窗口的字段中。 但是,没有任何测试通过标头。而且没有方法在其上具有“锁定”图标。
编辑:
我也尝试过:
c.ApiKey("our-token", "header", "Our Token Authentication", typeof(TokenAuthAttribute));
其中属性只是属性:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class TokenAuthAttribute : Attribute
{
}
然后,我们使用IActionFilter来检查属性是否应用于方法,这就是我们检查权限的地方。这样做是为了通过DI使用服务。
EDIT2:
我对Attribute的声明方式进行了更改:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class TokenAuthAttribute : AuthorizeAttribute
{
}
随后Swagger UI开始显示所有方法均为安全方法,因此它确实分析了实际上是AuthorizeAttribute
而不只是属性
之后,它开始像这样放置标头:
our-token: ZGV2OnYwMTA2YjZmYjdhLWRlNTUtNDZlNC1hN2Q4LTYxMjgwNTg2M2FiZQ==
应该在哪里:
Authorization: our-token GV2OnYwMTA2YjZmYjdhLWRlNTUtNDZlNC1hN2Q4LTYxMjgwNTg2M2FiZQ==
答案 0 :(得分:1)
如果我没记错的话,您应该有:
c.ApiKey("our-token", "header", "Our Token Authentication", typeof(TokenAuthAttribute));
在适当的位置上,所有标有TokenAuth
的操作都应显示一个锁定图标
您可以在我的其中一个中看到它的运行情况:
https://turoapi.azurewebsites.net/swagger/ui/index
后面的代码在这里:
https://github.com/heldersepu/TuroApi/blob/master/TuroApi/App_Start/SwaggerConfig.cs#L67