OWIN使用SignalR并防止'HTTP Error 403.14 - Forbidden'

时间:2015-06-16 09:20:37

标签: asp.net .net owin katana

我在一个OWIN自主应用程序中托管SignalR - 在Azure中,如下所示:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
    }
...

足够简单,工作正常。按预期公开/signalr/hubs

我想做的是当有人点击/网址时阻止HTTP 403.14。请求/返回HTTP 403.14:

  

HTTP错误403.14 - 禁止

我认为通过返回空响应来隐藏操作系统和托管详细信息会很好,以防“root”网址被命中。所以我想这样做:

app.Map("/", builder => builder.Use((context, func) => context.Response.WriteAsync(string.Empty)));

但是 - 不允许使用mapPath参数“/” - 它不能以斜杠结尾。

app.Use((context, func) => context.Response.WriteAsync(string.Empty));

这也会覆盖SignalR虚拟文件夹(/signal),从而使集线器无法访问。

这相当于过去在Web应用程序文件夹中使用emtpy index.htm页面。

1 个答案:

答案 0 :(得分:2)

您可以编写自己的中间件(这就是OWIN之美)来处理这些请求。我做了一个例子,它将返回状态码200并返回空:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use<OnlySignalRMiddleware>();
        app.MapSignalR();
    }
}

public class OnlySignalRMiddleware : OwinMiddleware
{
    public OnlySignalRMiddleware(OwinMiddleware next) : base(next) { }

    public override Task Invoke(IOwinContext context)
    {
        if (!context.Request.Path.HasValue || context.Request.Path.Value.StartsWith("/signalr"))
            return Next.Invoke(context); //continue the pipeline

        context.Response.StatusCode = 200;
        return context.Response.WriteAsync(""); //terminate the pipeline
    }
}

如果您愿意,还可以通过执行以下操作删除一些标题:

        context.Response.Headers.Remove("Server");