- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Angular 10 客户端和 .net core 3.1 后端。身份验证由 Azure Active Directory 解析。
我的本地环境中的一切都运行良好,但是当我将其发布到 kubernetes 托管的 docker 镜像中时。冒险开始了……
当我尝试从受 [Authorize]
保护的 Controller 获取信息时,我得到如下响应:
承载错误=“invalid_token”,error_description=“签名无效”
,代码为401
当我获取更多详细信息时,日志会显示:
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10511: Signature validation failed. Keys tried: 'Microsoft.IdentityModel.Tokens.X509SecurityKey, KeyId: 'HIDE', InternalId: 'HIDE'. , KeyId: HIDE '. kid: 'HIDE'. Exceptions caught: 'System.TypeInitializationException: The type initializer for 'Crypto' threw an exception. ---> System.TypeInitializationException: The type initializer for 'CryptoInitializer' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'libSystem.Security.Cryptography.Native.OpenSsl' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSystem.Security.Cryptography.Native.OpenSsl: cannot open shared object file: No such file or directory at Interop.CryptoInitializer.EnsureOpenSslInitialized(
at Interop.CryptoInitializer..cctor()
--- End of inner exception stack trace --- at Interop.CryptoInitializer.Initialize(
at Interop.Crypto..cctor()
--- End of inner exception stack trace --- at Interop.Crypto.DecodeRsaPublicKey(ReadOnlySpan`1 buf
at System.Security.Cryptography.RSAOpenSsl.ImportRSAPublicKey(ReadOnlySpan`1 source, Int32& bytesRead
at Internal.Cryptography.Pal.OpenSslX509Encoder.BuildRsaPublicKey(Byte[] encodedData
at Internal.Cryptography.Pal.OpenSslX509Encoder.DecodePublicKey(Oid oid, Byte[] encodedKeyValue, Byte[] encodedParameters, ICertificatePal certificatePal
at Internal.Cryptography.Pal.CertificateExtensionsCommon.GetPublicKey[T](X509Certificate2 certificate, Predicate`1 matchesConstraints
at System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(X509Certificate2 certificate
at Microsoft.IdentityModel.Tokens.X509SecurityKey.get_PublicKey(
at Microsoft.IdentityModel.Tokens.SupportedAlgorithms.IsSupportedAlgorithm(String algorithm, SecurityKey key
at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.IsSupportedAlgorithm(String algorithm, SecurityKey key
at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures, Boolean cacheProvider
at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateForVerifying(SecurityKey key, String algorithm, Boolean cacheProvider
at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateForVerifying(SecurityKey key, String algorithm
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(Byte[] encodedBytes, Byte[] signature, SecurityKey key, String algorithm, SecurityToken securityToken, TokenValidationParameters validationParameters
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters) '. token: 'HIDED'. at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
一些代码:
docker 镜像(我也尝试过仿生):
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY . ./
EXPOSE 80
ENTRYPOINT ["dotnet", "MyApp.dll"]
启动类
services.AddAuthentication()
.AddMicrosoftIdentityWebApi(
options =>
{
options.Authority = GetKeyOrDefault("AD:Instance") + GetKeyOrDefault("AD:TenantId");
options.Audience = "api://" + GetKeyOrDefault("AD:ClientId");
options.TokenValidationParameters.ValidateIssuer = false;
options.TokenValidationParameters.ValidAudiences = new[]
{
options.Audience
};
options.RequireHttpsMetadata = false;
options.Events = new JwtBearerEvents();
options.Events.OnAuthenticationFailed += context =>
{
_logger.Error(context.Exception?.ToString());
_logger.Error(context.Principal?.ToString());
_logger.Error(context.Scheme?.ToString());
return Task.CompletedTask;
};
options.Events.OnMessageReceived += context =>
{
_logger.Error(context.Token?.ToString());
return Task.CompletedTask;
};
options.Events.OnTokenValidated += context =>
{
_logger.Error(context.Properties?.ToString());
_logger.Error(context.Options?.ClaimsIssuer?.ToString());
_logger.Error(context.Options?.ForwardAuthenticate?.ToString());
return Task.CompletedTask;
};
_logger.Information($"JWT | {options.Authority} | {options.Audience} | {options.ClaimsIssuer}");
},
options =>
{
options.TenantId = GetKeyOrDefault("AD:TenantId");
options.ClientId = GetKeyOrDefault("AD:ClientId");
options.Instance = GetKeyOrDefault("AD:Instance");
options.Authority = "api://" + GetKeyOrDefault("AD:ClientId");
options.RequireHttpsMetadata = false;
_logger.Information($"JWT | {options.Authority} | {options.TenantId} | { options.ClientId } | {options.Instance} | | {options.ClaimsIssuer}");
options.Events.OnAuthenticationFailed += context =>
{
_logger.Error(context.Exception.ToString());
return Task.CompletedTask;
};
options.Events.OnMessageReceived += context =>
{
_logger.Error(context.Token.ToString());
return Task.CompletedTask;
};
options.Events.OnAccessDenied += context =>
{
_logger.Error(context.Properties.ToString());
_logger.Error(context.Options.ClaimsIssuer.ToString());
_logger.Error(context.Options.ForwardAuthenticate.ToString());
_logger.Error(context.Options.AccessDeniedPath.ToString());
return Task.CompletedTask;
};
})
.EnableTokenAcquisitionToCallDownstreamApi(
options =>
{
options.ClientSecret = GetKeyOrDefault("AD:ClientSecret");
options.ClientId = GetKeyOrDefault("AD:ClientId");
options.Instance = GetKeyOrDefault("AD:Instance");
options.TenantId = GetKeyOrDefault("AD:TenantId");
})
.AddMicrosoftGraph(_configuration.GetSection("PayAdmin:DownstreamAP"))
.AddInMemoryTokenCaches();
隐藏 - 加密文件
最佳答案
好的,我明白了:-)。
这是由 System.Security.Cryptography.OpenSsl 库版本引起的。就我而言,paket 管理器自动(用于依赖项引用)将我的库升级到 System.Security.Cryptography.OpenSsl 5.0.0 版本,因此我的 docker 镜像没有正确版本的 SDK,因此与使用 openssl 相关的所有操作都是失败。
在我的例子中,解决方案恢复为 System.Security.Cryptography.OpenSsl 4.7.0(我必须将此信息放入数据包依赖项中)
关于.net - 尝试通过 Docker 容器上的 JWT token 对用户进行身份验证时缺少 'libSystem.Security.Cryptography.Native.OpenSsl' - .net core 3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64919102/
我正在使用SQL Server 2008 R2,并且想创建一个触发器。 对于每个添加(仅添加),将像这样更新一列: ABC-CurrentYear-AutoIncrementCode 例子: ABC-
是否可以在显示最终一致性的数据存储中创建/存储用户帐户? 似乎不可能在没有一堆架构复杂性的情况下管理帐户创建,以避免可能发生具有相同 UID(例如电子邮件地址)的两个帐户的情况? 最终一致性存储的用户
您好, 我有一个带有 Identity 的 .NetCore MVC APP并使用 this指导我能够创建自定义用户验证器。 public class UserDomainValidator : IU
这与以下问题相同:HiLo or identity? 我们以本站的数据库为例。 假设该站点具有以下表格: 帖子。 投票。 注释。 使用它的最佳策略是什么: 身份 - 这是更常见的。 或者 HiLo -
我想将 Blazor Server 与 ASP.NET Identity 一起使用。但我需要使用 PostgreSQL 作为用户/角色存储,因为它在 AWS 中。 它不使用 EF,这是我需要的。 我创
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。 但是,在登录请求期
所以我在两台机器上都安装了 CYGWIN。 如果我这样做,它会起作用: ssh -i desktop_rsa root@remoteserver 这需要我输入密码 ssh root@remoteser
我尝试在 mac osx 上的终端中通过 telnet 连接到 TOR 并请求新身份,但它不起作用,我总是收到此错误消息: Trying 127.0.0.1... telnet: connect to
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我正在开发一项服务,客户可以在其中注册他们的 webhook URL,我将发送有关已注册 URL 的更新。为了安全起见,我想让客户端(接收方)识别是我(服务器)向他们发送请求。 Facebook和 G
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我是 .NET、MVC 和身份框架的新手。我注意到身份框架允许通过注释保护单个 Controller 操作。 [Authorize] public ActionResult Edit(int? Id)
我有一列具有身份的列,其计数为19546542,我想在删除所有数据后将其重置。我需要类似ms sql中的'dbcc checkident'这样的内容,但在Oracle中 最佳答案 在Oracle 12
这是我用来创建 session 以发送电子邮件的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enabl
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
在使用沙盒测试环境时,PayPal 身份 token 对某些人显示而不对其他人显示的原因是否有任何原因。 我在英国使用 API,终生无法生成或找到 token 。 我已经遵循协议(protocol)并
我对非常简单的事情有一些疑问:IDENTITY。我尝试在 phpMyAdmin 中创建表: CREATE TABLE IF NOT EXISTS typEventu ( typEventu
习语 #1 和 #5 是 FinnAPL Idiom Library两者具有相同的名称:“Progressive index of (without replacement)”: ((⍴X)⍴⍋⍋X⍳
当我第一次在 TFS 中设置时,我的公司拼错了我的用户名。此后他们将其更改为正确的拼写,但该更改显然未反射(reflect)在 TFS 中。当我尝试 checkin 更改时,出现此错误: 有没有一种方
我是一名优秀的程序员,十分优秀!