我有一个使用Owin的自托管应用程序,没有任何类型的ASP.MVC,因此应用程序中没有web.config。
我启用了Cookie身份验证和我自己的授权提供程序机制,它运行得非常好。 我的应用程序使用下一个代码提供一些静态内容:
appBuilder.UseFileServer(new FileServerOptions()
{
RequestPath = new PathString("/Images"),
FileSystem = new PhysicalFileSystem(@"./Images"),
});
但是这些内容不受Owin身份验证的保护,保护文件的最简单方法是什么?
*理想情况下不必实现为自己服务的整个文件。
答案 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”而不是请求的文件。