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

OWIN use SignalR and prevent 'HTTP Error 403.14 - Forbidden'

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

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

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

我想做的是在有人点击 / url 时阻止 HTTP 403.14。请求 / returns HTTP 403.14:

HTTP Error 403.14 - Forbidden

我认为最好通过返回空响应来隐藏 OS 和托管详细信息,以防 'root' url 被命中。所以我想这样做:

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 应用程序文件夹中有空的 index.htm 页面。

您可以编写自己的中间件(这就是 OWIN 的优点)来处理这些请求。我举了一个例子,它将 return statuscode 200 和 return 空:

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
    }
}

如果需要,您还可以删除一些 headers,方法是:

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