我确实在尝试长时间使用.NET Core API中的证书。
基本上,我需要在IIS和docker上运行的.NET Core Web API中使用它们。
我需要使用的证书用于:
Microsoft.AspNetCore.DataProtection
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(dataProtectionKeystorePath))
.ProtectKeysWithCertificate
(
new X509Certificate2(dataProtectionCertificatePath, dataProtectionCertificateSecret)
);
}
Run Code Online (Sandbox Code Playgroud)
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel
(
options =>
{
options.Listen(address, port, listenOptions =>
{
listenOptions.UseHttps(new X509Certificate2(sslCertificatePath, sslCertifciateSecret));
}
);
}
)
// other setup
;
Run Code Online (Sandbox Code Playgroud)
IdentityServer4.SigningCredentials
注意:此代码可从VS2017开始在开发机上运行,但会在Windows 2008 R2 IIS测试服务器上引发这些异常。
services.AddIdentityServer()
.AddSigningCredential
(
new X509Certificate2(tokenCertificatePath, tokenCertificatePassphrase)
)
// other setup
;
Run Code Online (Sandbox Code Playgroud)
这三个都意味着放置一个证书文件,使用构造函数加载它,传递密码,然后开始。
sarkasm>快乐,这很容易。<萨卡姆
因此,我创建了一个包含证书的certs子目录。添加了机密设置。验证所有值均已按预期加载/创建。验证文件位于预期位置并因此存在。简而言之:
string dataProtectionKeystorePath = System.Path.Combine(Environment.ContentRootPath, "keystore");
string dataProtectionCertificatePath = …Run Code Online (Sandbox Code Playgroud) c# x509certificate2 identityserver4 asp.net-core-2.1 .net-core-2.1
到目前为止,在IIS 7.5下托管.net核心(2.2)API的现有设置运行顺利且效果很好。
突然我发现日志保存了该消息,Application is shutting down...而没有任何错误或其他原因的迹象。当突然生成比以前更多的日志文件时,我开始意识到这一点。
我不确定,但是当我从.NET Core 2.1迁移到2.2时可能已经开始了。
有人知道这是功能还是错误,有害或故意?
到目前为止,我阅读了谷歌提出的文档、教程和其他 SO 问题,但似乎我错过了一些东西并且我不明白(工作)。
我尝试为 .NET Core 2.1 web api(微服务)实现一个非常小的 PostgreSQL 数据库。我习惯了数据库优先的方法,但对于这项服务,我决定尝试代码优先的方法。
我还决定使用 ModelBuilder 的 fluent api 来保持类与属性的清洁,并在 DbContext.OnModelCreating 方法中定义大部分结构。安迪也许有一次找到了一种解决方案,如何从 Postgres 特定元素中保持 DbContext 干净,并将它们移动到迁移中......
我的问题是需求定义了很多默认值,我无法让它们正常工作。
例如,我有一个表 Entity1,它只有 3 列:
时间戳默认值背后的想法是让数据库成为创建时间戳的单个实例,并使用 db 默认值作为所有正在运行的实例的配置。例如。当需求更改为“默认值现在应该为 false”时,我们只需更改现有数据库中的 db 默认值并更新更新分期付款的迁移。
我的模型构建器代码目前是:
modelBuilder.Entity<Entity1>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.ValueGeneratedOnAdd();
entity.Property(e => e.IsEnabled)
.HasDefaultValue(true)
.ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.LastStatusChange)
.HasColumnType("timestamp without time zone")
.HasDefaultValueSql("CURRENT_TIMESTAMP")
.ValueGeneratedOnAddOrUpdate();
});
Run Code Online (Sandbox Code Playgroud)
这适用于新创造的价值。
切换或重置我使用的字段时
entity.LastStatusChange = null;
Run Code Online (Sandbox Code Playgroud)
和或
entity.IsEnabled = null;
Run Code Online (Sandbox Code Playgroud)
我假设将它们设置为 null 会触发默认值的创建,但这不会影响 LastStatusChange …
postgresql npgsql entity-framework-core .net-core .net-core-2.1
我创建了一个映射到MyBean.beansField的表单.我使用了javax.validation.NotNull anotation来确保它必须输入.到目前为止一切正常但错误消息如下所示:
beansField:不能为null.
无论我到目前为止尝试了什么,我都无法删除消息前面的"beansField:".
任何人都可以告诉我这个前缀来自哪里以及如何摆脱它?
I'm facing an exception when trying to create a JWT token in C# Web API application.
Test environment
Here is the code responsible for generating RSA keys:
public SignatureInformation CreateNewSignatureInformation(int length = 0)
{
try
{
var signatureInformation = new SignatureInformation();
var rsaProvider = new RSACryptoServiceProvider(length);
var publicKey = rsaProvider.ToXmlString(false);
signatureInformation.Public = publicKey;
var privateKey = rsaProvider.ToXmlString(true);
signatureInformation.Private = privateKey;
return signatureInformation;
}
catch (Exception)
{ …Run Code Online (Sandbox Code Playgroud) 以下场景:
您将敏感且受保护的用户信息(姓名、邮件地址、电话号码、地址)安全地保存在授权服务器(例如 IdentityServer4)中。
您有一个 API 从存储您自己的数据(不是敏感用户数据)的第二个数据库加载数据。该数据以某种方式链接到用户(假设我们存储文档并且文档 A 属于具有 auth-id“XYZ”的用户)。
问题:
现在,单页应用程序获取文档列表,并希望显示拥有该文档的用户的姓名和电子邮件地址。
到目前为止,我了解 OpenID Connect UserInfo 端点仅返回当前登录用户的用户信息,而不返回其他用户的用户信息。因此需要在其他地方获取其他用户的信息。
解决方案1:将用户信息复制到第二个数据库中。这会从安全的授权服务器中泄漏敏感数据,需要保持数据同步(如果在身份验证服务器上更改),这会在身份验证服务器到第二个数据库或身份验证服务器到 API 端点之间引入连接。
解决方案 2:让 API 访问 auth DB 并从那里获取数据。可能,但引入了数据库连接到授权数据库是什么(我个人认为不好)。
解决方案 3:在授权服务器上引入一个端点(如 UserInfo 端点),让单页应用程序通过身份验证 ID 请求用户信息。看起来最实用但似乎没有具体说明?
有官方指定/推荐的方法来解决这个问题吗?也许是使用 UserInfo 端点来实现我迄今为止错过的规范?
只是 my.domain.com/userinfo/XYZ 返回具有 auth-id XYZ 的用户的信息???
我正在 .NET Core 2.2 中开发一些 Web api
这些需求使我们达到了在多个 Redis 存储中存储/缓存/集中数据的地步(为了简单起见,我们假设有 2 个 Redis 服务器)。
那将是(例如)
到目前为止,数据保护似乎有效,并且按照基本使用指南中的建议,使用连接多路复用器(预先将其添加为单例以供重用)进行配置。
StartUp.ConfigureServices的相关部分
ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("server1:6729");
services.AddSingleton<IConnectionMultiplexer>(cm);
services.AddDataProtection()
.SetApplicationName("myapp")
.PersitKeysToStackExchangeRedis(cm, "DataProtection-Keys");
Run Code Online (Sandbox Code Playgroud)
密钥按预期存储在服务器 1 上的 Redis 存储中。
现在我需要集成第二个存储。
ConnectionMultiplexer 可以用来连接两台服务器吗?
ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("server1:6729;server2:6729"); //?
Run Code Online (Sandbox Code Playgroud)
如何获得指向正确(第一或第二)服务器的正确数据库?
我仅在VS 2017模板对话框中启用了“配置HTTPS”,从而创建了.NET Core Web应用程序。
我用了
dotnet dev-certs https --trust
Run Code Online (Sandbox Code Playgroud)
并确认提示。我用MMC检查了CurrentUser / My中是否存在本地主机证书。
当我现在运行该应用程序时,Firefox仅向我显示(我不知道确切的英语翻译)
连接到https // localhost:44371时发生错误PR_CONNECT_RESET_ERROR
Chrome浏览器还会显示以下错误,
ERR_CONNECTION_RESET
我也禁用了Windows防火墙,但结果是相同的。
当我取消选中项目调试属性中的“启用SSL”时,该站点显示良好,但没有HTTPS。
任何人都知道可能出什么问题,或者在Github中我可以找到查找证书的代码吗?
更新1:
我从使用IIS Express的Visual Studio(2017)启动应用程序切换到了Kestrel,后者打开了控制台窗口并告诉我更多信息:
info: Microsoft.AspNetCore.Server.Kestrel[20]
Connection id "0HLOLGRVN8U0U" request processing ended abnormally.
System.IO.IOException: The decryption operation failed, see inner exception. ---
> System.ComponentModel.Win32Exception: Beim Verarbeiten des Zertifikats ist ein
unbekannter Fehler aufgetreten
--- End of inner exception stack trace ---
at System.Net.Security.SslStreamInternal.ReadAsyncInternal[TReadAdapter](TRea
dAdapter adapter, Memory`1 buffer)
at Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.AdaptedPipeline.
ReadInputAsync(Stream stream)
at System.IO.Pipelines.PipeCompletion.ThrowLatchedException()
at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& result)
at System.IO.Pipelines.Pipe.GetReadAsyncResult()
at …Run Code Online (Sandbox Code Playgroud) 我来自使用 Java、C#、C++、Javascript 的程序员背景
我给自己买了一个树莓派(Model 1 A,没有以太网的那个)并玩了一段时间。我使用了 Raspbian 和 Arch Linux ARM(因为有人说它小巧且可定制)。不幸的是,我没有按照我想要的方式配置它们。
我正在尝试构建一个漂亮的(嵌入式)系统,其唯一目标是快速启动(启动)Raspberry Pi 并自动启动一个测试应用程序,该应用程序将使用 C#(Mono)、C++(Qt)、Java(Java 运行时)编写或 JavaScript/HTML 中的东西。
由于我无法删除所有日志消息(我删除了大部分)、tty 登录屏幕、连接到网络的尝试(尽管 Model 1 A 根本没有以太网)启动是丑陋的并且花了很长时间(在某些情况下 +1 分钟)。
似乎我必须构建一个最小的嵌入式 linux,但我缺乏嵌入式 linux 元素的理论以及它们如何组合在一起。
我的问题:在树莓派上支持 mono、qt、java 运行时的嵌入式 linux 理论上需要哪些部分?
到目前为止,我知道以下部分:
但是呢?我的研究在“使用发行版”中迷失了我不想要的东西。内核和启动应用程序之间缺少哪些部分?
.NET Core配置允许许多选项来添加值(环境变量,json文件,命令行args)。
我只是想不通,找到一个如何通过代码填充它的答案。
我正在编写用于配置扩展方法的单元测试,我认为通过代码在单元测试中填充它比为每个测试加载专用的json文件容易。
我当前的代码:
[Fact]
public void Test_IsConfigured_Positive()
{
// test against this configuration
IConfiguration config = new ConfigurationBuilder()
// how to populate it via code
.Build();
// the extension method to test
Assert.True(config.IsConfigured());
}
Run Code Online (Sandbox Code Playgroud)
更新:
一种特殊情况是“空部分”,它在json中看起来像这样。
{
"MySection": {
// the existence of the section activates something triggering IsConfigured to be true but does not overwrite any default value
}
}
Run Code Online (Sandbox Code Playgroud)
更新2:
就像马修(Matthew)在评论中指出的那样,在json中有一个空白部分会产生与根本没有该部分相同的结果。我列举了一个例子,是的,就是这样。我期望其他行为是错误的。
所以我该怎么办,我期望什么:
我正在为IConfiguration的2个扩展方法编写单元测试(实际上是由于某些原因,Get ... Settings方法中的值绑定不起作用(但这就是一个不同的主题)。它们看起来像这样:
public static bool IsService1Configured(this IConfiguration configuration)
{
return configuration.GetSection("Service1").Exists();
}
public …Run Code Online (Sandbox Code Playgroud) .net-core ×5
c# ×4
asp.net-core ×1
iis ×1
iis-7.5 ×1
iis-express ×1
jsf ×1
jwt ×1
npgsql ×1
oauth-2.0 ×1
postgresql ×1
primefaces ×1
raspberry-pi ×1
redis ×1
rsa ×1
theory ×1
userinfo ×1
wif ×1
xunit ×1