我使用ASP开发了一个应用程序。Net web API 2。应用程序已经完成,并且处于对其进行安全审查的过程中,但是要求之一是必须禁用任何登录的GET请求。
我们正在通过POST调用令牌操作,但是安全团队发现您仍然可以使用GET发出相同的请求,并且需要删除。我知道令牌调用是内置于整个OWIN/OAUTH系统中的令牌调用,但是是否有可能将其配置为仅接受POST请求并阻止GET?
通过查看武士刀项目的源代码,我可以看到在Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerHandler
中他们有以下检查:
if (Options.TokenEndpointPath.HasValue && Options.TokenEndpointPath == Request.Path)
{
matchRequestContext.MatchesTokenEndpoint();
}
正如您所看到的,没有对HTTP METHOD进行额外检查。因此,作为可能的解决方案之一,我可以建议您编写自己的中间件,它在身份验证之前执行,并检查HTTP METHOD:
public class OnlyPostTokenMiddleware : OwinMiddleware
{
private readonly OAuthAuthorizationServerOptions opts;
public OnlyPostTokenMiddleware(OwinMiddleware next, OAuthAuthorizationServerOptions opts) : base(next)
{
this.opts = opts;
}
public override Task Invoke(IOwinContext context)
{
if (opts.TokenEndpointPath.HasValue && opts.TokenEndpointPath == context.Request.Path && context.Request.Method == "POST")
{
return Next.Invoke(context);
}
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
context.Response.ReasonPhrase = "Not Found";
return context.Response.WriteAsync("Not Found");
}
}
那么在Startup.cs中你会有类似的内容:
var authOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/token"),
Provider = Resolver.GetService<OAuthProvider>(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1)
};
app.Use<OnlyPostTokenMiddleware>(authOptions);
app.UseOAuthAuthorizationServer(authOptions);