【问题标题】:File Path for PersistKeysToFileSystem on shared server共享服务器上 PersistKeysToFileSystem 的文件路径
【发布时间】:2019-03-23 14:40:08
【问题描述】:

我正在尝试让我的密钥对登录的用户持续存在。由于我目前正在为网站使用共享主机,因此我决定使用文件系统来存储密钥环。所以代码看起来像这样:

services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(""))
.SetApplicationName("MyWebsite")
.SetDefaultKeyLifetime(TimeSpan.FromDays(90))
.ProtectKeysWithCertificate(cert);

但是,我并不真正了解的是我应该将这些钥匙放在哪里,以及我要经过什么路径才能让它们在那里。由于这是一个 MVC 核心应用程序,我有点困惑,在 MVC 5 中我会将它放在 App_Data 文件夹中,但这里没有 App_Data 文件夹,我想确保它保持安全并且无法通过浏览器访问。

另一件事是我传递的是相对路径还是直接路径?如果是相对的,我的出发点在哪里?是bin、根目录还是别的什么?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core-mvc asp.net-core-identity asp.net-core-mvc-2.0


    【解决方案1】:

    最简单的方法可能是在 app 文件夹中创建一个文件夹。例如,创建一个名为Keys 的文件夹,并使用IHostingEnvironment 对象获取app 文件夹。像这样的:

    public class Startup
    {
        private readonly IHostingEnvironment _environment;
    
        public Startup(IHostingEnvironment environment)
        {
            _environment = environment;
        }
    
        public void ConfigureServices(IServiceCollection services)
        {
            var keysFolder = Path.Combine(_environment.ContentRootPath, "Keys");
    
            services.AddDataProtection()
                .PersistKeysToFileSystem(new DirectoryInfo(keysFolder))
                .SetApplicationName("MyWebsite")
                .SetDefaultKeyLifetime(TimeSpan.FromDays(90))
                .ProtectKeysWithCertificate(cert);
        }
    
        // snip
    }
    

    【讨论】:

    • 你说的app文件夹是指网站的根目录吗?
    • 是的,在wwwroot 文件夹旁边(但不在该文件夹内,否则文件可能会被提供给浏览器)
    • 至于 IHostingEnvironment,那我是用 IServiceCollection 注入它吗?
    • 这是历史上最糟糕的方法之一,因为在安全的 Web 应用程序环境中,您没有对应用程序文件夹的写入权限 - 并且:在下一次部署时,这些内容将被永久删除。
    • @BenjaminAbt 我只是说这远没有你声称的那么糟糕。首先,.NET Core 使应用程序代码与提供的资产完全不同。所以是的,这是放置这些文件的安全地方。在那里存储安全数据并不荒谬。
    猜你喜欢
    • 2017-12-14
    • 2013-09-27
    • 2013-10-08
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多