在尝试使用AzureKeyVault保护密钥时,我遇到以下错误:
00:01:41错误]读取钥匙圈时出错。微软蔚蓝色的钥匙库。模型。KeyVaultErrorException:操作在Microsoft返回了无效的状态代码“禁止”。蔚蓝色的钥匙库。KeyVault客户端。WrapkeyWithTtpMessageAsync(String Vault BaseUrl、String keyName、String keyVersion、String算法、Byte[]值、Dictionary`2 customHeaders、CancellationToken CancellationToken)位于Microsoft。蔚蓝色的钥匙库。KeyVaultClientExtensions。微软的WrapKeyAsync(IKeyVaultClient操作、字符串键标识符、字符串算法、字节[]键、CancellationToken CancellationToken)。AspNetCore。数据保护。AzureKeyVault。AzureKeyVault加密机。微软的EncryptAsync(XElement plaintextElement)。AspNetCore。数据保护。AzureKeyVault。AzureKeyVault加密机。在微软加密(XElement plaintextElement)。AspNetCore。数据保护。XmlEncryption。XmlEncryptionExtensions。微软公司的EncryptIfEssential(IXmlEncryptor encryptor,XElement element)。AspNetCore。数据保护。钥匙管理。XmlKeyManager。微软AspNetCore。数据保护。钥匙管理。内部的IInternalXmlKeyManager。在Microsoft上创建新密钥(Guid keyId、DateTimeOffset creationDate、DateTimeOffset activationDate、DateTimeOffset expirationDate)。AspNetCore。数据保护。钥匙管理。XmlKeyManager。在Microsoft创建新密钥(DateTimeOffset activationDate、DateTimeOffset expirationDate)。AspNetCore。数据保护。钥匙管理。KeyRingProvider。微软的CreateCacheableKeyRingCore(现在是DateTimeOffset,IKey keyJustAdded)。AspNetCore。数据保护。钥匙管理。KeyRingProvider。微软AspNetCore。数据保护。钥匙管理。内部的iCachableKeyringProvider。微软的GetCacheableKeyRing(现在是DateTimeOffset)。AspNetCore。数据保护。钥匙管理。KeyRingProvider。GetCurrentKeyRingCore(日期时间utcNow)
我试着使用这样的方法:
services.AddDataProtection()
.SetApplicationName("APPLICATIONNAME")
.PersistKeysToAzureBlobStorage(container, "keys.xml")
.ProtectKeysWithAzureKeyVault(KeyVaultClientFactory.Create(), "https://KEYVAULTNAME.vault.azure.net/keys/DATAPROTECTIONKEY/");
我检查过的东西:
我现在不知道如何进一步调试它。我想我遗漏了一些明显的东西,欢迎提供任何建议!
我建议您像下面这样更改实现:
{
"DataProtection": {
"KeyVaultKeyId": "https://mykeyvaultname.vault.azure.net/keys/DataProtectionKey/bfc1bda979bc4081b89ab6f43bad12b8"
}
}
var kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(_tokenProvider.KeyVaultTokenCallback));
services.AddDataProtection()
.ProtectKeysWithAzureKeyVault(kvClient, settings.KeyVaultKeyId);
请确保为应用程序提供密钥库的“展开密钥”和“包裹密钥”权限。请注意,t在授予许可后需要时间来反映更改。
您可以在此处查看参考代码:
https://github.com/aspnet/AspNetCore/blob/6f197a9e5d08477b598826e0d028019c9d62ad82/src/DataProtection/AzureKeyVault/src/AzureDataProtectionBuilderExtensions.cs
其他参考资料:
https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-2.2
https://joonasw.net/view/using-azure-key-vault-and-azure-storage-for-asp-net-core-data-protection-keys
这就是我创业的方式。cs看起来像:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using KeyVaultSample.Data;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.AspNetCore.DataProtection.AzureStorage;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.Rest;
using Microsoft.WindowsAzure.Storage.Auth;
namespace KeyVaultSample
{
public class DataProtectionSettings
{
public string KeyVaultKeyId { get; set; }
public string AadTenantId { get; set; }
public string StorageAccountName { get; set; }
public string StorageKeyContainerName { get; set; }
public string StorageKeyBlobName { get; set; }
}
public class Startup
{
private readonly AzureServiceTokenProvider _tokenProvider;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
_tokenProvider = new AzureServiceTokenProvider();
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
var settings = Configuration.GetSection("DataProtection").Get<DataProtectionSettings>();
var kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(_tokenProvider.KeyVaultTokenCallback));
services.AddDataProtection()
.ProtectKeysWithAzureKeyVault(kvClient, settings.KeyVaultKeyId);
// Replicates PersistKeysToAzureBlobStorage
// There is no overload to give it the func it ultimately uses
// We need to do that so that we can get refreshed tokens when needed
services.Configure<KeyManagementOptions>(options =>
{
options.XmlRepository = new AzureBlobXmlRepository(() =>
{
// This func is called every time before getting the blob and before modifying the blob
// Get access token for Storage
// User / managed identity needs Blob Data Contributor on the Storage Account (container was not enough)
string accessToken = _tokenProvider.GetAccessTokenAsync("https://storage.azure.com/", tenantId: settings.AadTenantId)
.GetAwaiter()
.GetResult();
// Create blob reference with token
var tokenCredential = new TokenCredential(accessToken);
var storageCredentials = new StorageCredentials(tokenCredential);
var uri = new Uri($"https://{settings.StorageAccountName}.blob.core.windows.net/{settings.StorageKeyContainerName}/{settings.StorageKeyBlobName}");
// Note this func is expected to return a new instance on each call
var blob = new CloudBlockBlob(uri, storageCredentials);
return blob;
});
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc();
}
}
}
希望有帮助。
如何配置Angular和VSCode,使我的断点工作?
问题内容: 我正在使用JavaScript测试运行程序“摩卡”。 我的测试失败了,因此我将使用进行调试。 但是运行测试时,没有输出(仅来自Mocha的测试结果)。看来Mocha已捕获并抑制了我的输出! 如何让Mocha显示输出?(对于失败的测试)? 编辑: 抱歉!- 在测试期间可以正常工作!我肯定一直期望它抑制输出,而且我没有正确检查自己的代码。感谢您的回应。所以…话虽如此…也许抑制通过测试的输出
问题内容: 我们如何使用IE 8调试JavaScript? 在更新到IE 8后,无法使用Visual Studio进行JavaScript调试。 问题答案: 我今天发现,我们现在可以使用IE 8中集成的开发人员工具栏插件来调试Javascript。 单击选项卡右侧工具栏上的 ▼工具 。 选择 开发人员工具 。开发人员工具对话框应打开。 单击对话框中的 脚本 选项卡。 单击 开始调试 按钮。 您可以
问题内容: 我一直在努力使AJAX与Jquery一起使用。到目前为止,我最大的问题是我真的不知道如何弄清楚我在哪里犯错。我真的没有调试AJAX调用的好方法。 我正在尝试建立一个管理页面,其中我要执行的功能之一就是更改SQL数据库中设置的权限。我知道.click函数正在被触发,因此我将其范围缩小了,但是我不确定从AJAX调用到SQL查询的链在哪里出了问题。 我的.js代码: 我的.php处理程序:
我在本地开发一个Node.js应用与Azure Functions Core Tools。我想在VS Code调试器的帮助下调试它,但是我得到了这个错误: 对于调试选项,我选择了“附加到JavaScript函数”。默认情况下,这个选项就在那里,我还没有创建它。 以下是我launch.json的内容: 如何解决此问题并使调试正常工作?
问题内容: 简短版的问题: 如何让gdb使用libc的调试符号? 较长的版本: 我正在使用gdb调试程序,我想查看有关libc使用的futex的信息。但是,在调试过程中的某个时刻,我得到如下输出: 当我在断点处在gdb中运行时,我看到: 当我跑步时,我看到: 我正在使用Ubuntu 10.04,我认为带有调试符号的libc版本在中。我尝试将变量设置为在路径的开头,但这似乎没有什么不同。 我尚不清楚