我们在 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 使用服务。
编辑2:
我对 Attribute 的声明方式进行了更改:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class TokenAuthAttribute : AuthorizeAttribute
{
}
在 Swagger UI 开始将所有方法显示为安全之后,因此它确实分析它实际上是AuthorizeAttribute
,而不仅仅是 Attribute
之后它开始像这样放置标题:
our-token: ZGV2OnYwMTA2YjZmYjdhLWRlNTUtNDZlNC1hN2Q4LTYxMjgwNTg2M2FiZQ==
它应该在哪里:
Authorization: our-token GV2OnYwMTA2YjZmYjdhLWRlNTUtNDZlNC1hN2Q4LTYxMjgwNTg2M2FiZQ==