禁用 WEB API 令牌调用的 GET 功能
Disable GET functionality of WEB API token call
我使用 ASP.NET WEB API 开发了一个应用程序 2. 应用程序已完成,正在对其进行安全审查,但其中一项要求是任何 GET 请求必须禁用登录。
我们正在 POST 上调用令牌操作,但安全团队发现您仍然可以使用 GET 发出相同的请求,需要将其删除。我知道令牌调用是内置于整个 OWIN/OAUTH 系统中的,但是是否可以对其进行配置,使其只接受 POST 请求并阻止 GET?
提前致谢。
通过查看 Katana 项目源,我可以看到在 Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerHandler
他们有以下检查:
if (Options.TokenEndpointPath.HasValue && Options.TokenEndpointPath == Request.Path)
{
matchRequestContext.MatchesTokenEndpoint();
}
如您所见,没有对 HTTP METHOD 进行额外检查。因此,作为一种可能的解决方案,我建议您编写自己的中间件,该中间件在身份验证之前执行并检查 HTTP 方法:
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);
我使用 ASP.NET WEB API 开发了一个应用程序 2. 应用程序已完成,正在对其进行安全审查,但其中一项要求是任何 GET 请求必须禁用登录。
我们正在 POST 上调用令牌操作,但安全团队发现您仍然可以使用 GET 发出相同的请求,需要将其删除。我知道令牌调用是内置于整个 OWIN/OAUTH 系统中的,但是是否可以对其进行配置,使其只接受 POST 请求并阻止 GET?
提前致谢。
通过查看 Katana 项目源,我可以看到在 Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerHandler
他们有以下检查:
if (Options.TokenEndpointPath.HasValue && Options.TokenEndpointPath == Request.Path)
{
matchRequestContext.MatchesTokenEndpoint();
}
如您所见,没有对 HTTP METHOD 进行额外检查。因此,作为一种可能的解决方案,我建议您编写自己的中间件,该中间件在身份验证之前执行并检查 HTTP 方法:
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);