Asp.net 禁用WEB API令牌调用的获取功能

Asp.net 禁用WEB API令牌调用的获取功能,asp.net,asp.net-identity,asp.net-web-api2,Asp.net,Asp.net Identity,Asp.net Web Api2,我使用ASP.NET WEB API 2开发了一个应用程序。应用程序已经完成,并且正在对其进行安全审查,但其中一个要求是必须禁用任何登录GET请求 我们正在通过POST调用令牌操作,但是安全团队发现,您仍然可以使用GET发出相同的请求,需要删除该请求。我知道令牌调用是一个内置于整个OWIN/OAUTH系统中的调用,但是是否可以将其配置为只接受POST请求并阻止GET 提前感谢。通过查看Katana项目源代码,我可以在Microsoft.Owin.Security.OAuth.OAuthAutho

我使用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方法没有额外的检查。因此,作为可能的解决方案之一,我可以建议您编写自己的中间件,该中间件在身份验证之前执行,并检查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);
var authOptions=新的OAuthAuthorizationServerOptions
{
TokenEndpointPath=新路径字符串(“/token”),
Provider=Resolver.GetService(),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(1)
};
应用程序使用(authOptions);
app.useAuthAuthorizationServer(authOptions);

老兄,你是个传奇人物。我只是做了一些小改动。调用截获每个传入的请求,因此它允许的唯一请求是POST to“/令牌”。所以我只是将invoke if检查从context.Request.Method==“POST”更改为context.Request.Method!=“POST”,然后交换if语句返回和if下面的3行,因此它只阻止“/token”,而不是它允许的其他请求的“POST”。谢谢,我很高兴我的回答帮助了您。我相信你的方法和我在回答中描述的方法没有太大区别。因此,如果你不介意的话,我不会改变它:)