在Owin自托管应用程序中使用授权服务文件

时间:2016-07-25 18:58:12

标签: c# owin

我有一个使用Owin的自托管应用程序,没有任何类型的ASP.MVC,因此应用程序中没有web.config。

我启用了Cookie身份验证和我自己的授权提供程序机制,它运行得非常好。 我的应用程序使用下一个代码提供一些静态内容:

appBuilder.UseFileServer(new FileServerOptions()
{
    RequestPath = new PathString("/Images"),
    FileSystem = new PhysicalFileSystem(@"./Images"),
});

但是这些内容不受Owin身份验证的保护,保护文件的最简单方法是什么?

*理想情况下不必实现为自己服务的整个文件。

2 个答案:

答案 0 :(得分:3)

到目前为止,我已经设法以这种方式做到了:

        var contentFileServer = new FileServerOptions()
        {
            RequestPath = new PathString("/Content"),
            FileSystem = new PhysicalFileSystem(@"./Content"),
        };

        contentFileServer.StaticFileOptions.OnPrepareResponse = (context) => 
        {
            if (context.OwinContext.Authentication.User == null)
            {
                // Reply an unauthorized
                context.OwinContext.Response.StatusCode = 401;
            }
        };

        appBuilder.UseFileServer(contentFileServer);

看起来是一种合理的方式。

答案 1 :(得分:1)

@Cristian T答案需要延长。请参阅我的评论:“这只设置了HTTP状态代码,它还会发送请求的文件,您可以在浏览器控制台的”网络“选项卡中看到它......”

因此,要禁用发送文件,您必须在StaticFileContext之前自行编写响应。 OnPrepareResponse函数应为:

contentFileServer.StaticFileOptions.OnPrepareResponse = (context) => 
{
    if (context.OwinContext.Authentication.User == null)
    {
        // Reply an unauthorized
        const string unauthorizedBody = "Unauthorized"; // or HTML or anything else
        ctx.OwinContext.Response.StatusCode = 401;
        ctx.OwinContext.Response.Headers.Set("Content-Length", unauthorizedBody.Length.ToString());
        ctx.OwinContext.Response.Headers.Set("Content-Type", "text/html");
        ctx.OwinContext.Response.Write(unauthorizedBody);
    }
};

这样,服务器返回“Unauthorized”而不是请求的文件。