数据保护密钥未保留到Azure

时间:2017-08-15 22:33:13

标签: c# asp.net azure asp.net-core

我在Azure VM中的IIS中托管了一个ASP.NET Core应用程序。我调用扩展方法来保持它们键入Azure,但没有任何东西存储在那里,应用程序似乎仍然使用本地密钥。我在这里遵循了这个例子:http://intellitect.com/staying-logged-across-azure-app-service-swap/。事实上,当我在控制台应用程序中测试代码时,持久性工作正常。但是,当我使用此代码运行ASP.NET Core应用程序时,Azure中没有任何内容持久存在。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

请检查注册MVC服务和DataProtection服务的顺序。注册DataProtection服务必须在注册MVC服务之前。以下代码供您参考。

// Add DataProtection Service
if (storageUrl != null && sasToken != null && containerName != null && applicationName != null && blobName != null)
{
    // Create the new Storage URI
    Uri storageUri = new Uri($"{storageUrl}{sasToken}");

    //Create the blob client object.
    CloudBlobClient blobClient = new CloudBlobClient(storageUri);

    //Get a reference to a container to use for the sample code, and create it if it does not exist.
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExists();

    services.AddDataProtection()
        .SetApplicationName(applicationName)
        .PersistKeysToAzureBlobStorage(container, blobName);
}

// Add framework services.
services.AddMvc();

答案 1 :(得分:2)

我将上述回答标记为答案,因为它是正确的,也是重要的一点。但是,这个问题的真正答案是关键数据不会因为应用程序启动而持久存在而且您调用了PersistKeysToAzureBlobStorage(或任何其他PersistToXXX方法)。这只是用于配置数据保护。你可以说它是“懒惰的”。密钥数据将使用您的代码生成,或者框架首先调用Protect / Unprotect,如下所示:

var protector = provider.CreateProtector("Some Purpose");
var enc = protector.Protect("Hello World");
...
protector.Unprotect(enc);

答案 2 :(得分:2)

标记的答案帮助我调试了密钥无法持久保存到Blob存储的问题。

在我的情况下,这是因为现有blob / xml中缺少根元素。

如果有一个现有的Blob被引用,则它必须包含以下内容,以便数据保护库在延迟初始化时使用键填充它:

<?xml version="1.0" encoding="utf-8"?><repository></repository>

documentation没有提及。