- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在研究一个解决方案,该解决方案使用 STS、客户端和客户端使用的 WCF 服务。目前,这一切都是通过配置完成的,客户端成功检索 token 并将其传递给 WCF 服务。
问题出现在证书上,我们正在使用受传输安全保护的 net.tcp 绑定(bind)以及安全 token ,并且作为此要求,我们需要 SSL 证书。这个证书配置如下(我去掉了不相关的xml):
<behavior name="Federated">
<serviceAuthorization principalPermissionMode="Always" />
<serviceCredentials useIdentityConfiguration="true">
<serviceCertificate findValue="CN=SSLCert" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName" />
</serviceCredentials>
</behavior>
问题是这里指定的服务证书也是 WIF 用来解密它收到的 token 的证书,因为这种情况下的依赖方分布在多台机器上, token 在它们之间传递,这是 Not Acceptable 使用 SSL 证书作为加密 (RP) 证书。
是否有办法为 net.tcp 绑定(bind)指定单独的 SSL 证书和加密证书,还是它们必须始终相同?
只是重新迭代 token 的流程如下:
sts*(encrypted)* > client*(encrypted)* > dmz-broker*(需要解密)* > internal-服务器*(需要解密)*
我曾尝试将服务证书更改为加密证书,但随后将其用于 SSL 但失败了。我还尝试设置指定证书和 DNS 值的端点的身份,但都没有成功。
在此先感谢您的帮助。
最佳答案
我最终使用自定义 SecurityToken 解析器设法解决了这个问题。这涉及复制作为标准 .NET 类 (http://referencesource.microsoft.com/#System.IdentityModel/System/IdentityModel/Selectors/SecurityTokenResolver.cs) 的 SimpleTokenResolver,然后创建它并传入与用于解密 token 的证书相关的安全 token 。
我们可以在 .NET 4.5 源代码中看到,当初始化 WIF 时,会创建一个 token 解析器,并使用作为 token 传入的服务证书:
SecurityTokenResolver serviceCertificateResolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(new ReadOnlyCollection<SecurityToken>(
new SecurityToken[] { new X509SecurityToken(this.ServiceCertificate) }), false);
这意味着框架在默认情况下会创建一个解析器,该解析器使用您为 SSL 指定的完全相同的证书进行解密。
不幸的是,CreateDefaultSecurityTokenResolver 方法内部使用的 SimpleTokenResolver 是私有(private)的,不能继承或覆盖,但是通过从上面的链接中获取代码并在构造函数中传递正确的证书(可以从应用程序中读取)设置)您可以添加自己的解析器。
public CustomSecurityTokenResolver()
: this(new ReadOnlyCollection<SecurityToken>(new SecurityToken[] { new X509SecurityToken(CertificateHelper.GetFromAppSetting("EncryptionCertificate")) }), false)
{
}
然后可以在配置中指定此 token 解析器,如下所示:
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<securityTokenHandlerConfiguration>
<serviceTokenResolver type="MySecurity.CustomSecurityTokenResolver, MySecurity">
</serviceTokenResolver>
</securityTokenHandlerConfiguration>
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
请注意,其他解析器仍添加到安全 token 解析器集合中,并且此解析器将在框架创建的默认值之后命中。
整个自定义解析器的代码如下所示:
public class CustomSecurityTokenResolver: SecurityTokenResolver
{
ReadOnlyCollection<SecurityToken> tokens;
bool canMatchLocalId;
public CustomSecurityTokenResolver()
: this(new ReadOnlyCollection<SecurityToken>(new SecurityToken[] { new X509SecurityToken(CertificateHelper.GetFromAppSetting("EncryptionCertificate")) }), false)
{
}
public CustomSecurityTokenResolver(ReadOnlyCollection<SecurityToken> tokens, bool canMatchLocalId)
{
this.tokens = tokens;
this.canMatchLocalId = canMatchLocalId;
}
protected override bool TryResolveSecurityKeyCore(SecurityKeyIdentifierClause keyIdentifierClause, out SecurityKey key)
{
key = null;
for (int i = 0; i < this.tokens.Count; ++i)
{
SecurityKey securityKey = this.tokens[i].ResolveKeyIdentifierClause(keyIdentifierClause);
if (securityKey != null)
{
key = securityKey;
return true;
}
}
if (keyIdentifierClause is EncryptedKeyIdentifierClause)
{
EncryptedKeyIdentifierClause keyClause = (EncryptedKeyIdentifierClause)keyIdentifierClause;
SecurityKeyIdentifier keyIdentifier = keyClause.EncryptingKeyIdentifier;
if (keyIdentifier != null && keyIdentifier.Count > 0)
{
for (int i = 0; i < keyIdentifier.Count; i++)
{
SecurityKey unwrappingSecurityKey = null;
if (TryResolveSecurityKey(keyIdentifier[i], out unwrappingSecurityKey))
{
byte[] wrappedKey = keyClause.GetEncryptedKey();
string wrappingAlgorithm = keyClause.EncryptionMethod;
byte[] unwrappedKey = unwrappingSecurityKey.DecryptKey(wrappingAlgorithm, wrappedKey);
key = new InMemorySymmetricSecurityKey(unwrappedKey, false);
return true;
}
}
}
}
return key != null;
}
protected override bool TryResolveTokenCore(SecurityKeyIdentifier keyIdentifier, out SecurityToken token)
{
token = null;
for (int i = 0; i < keyIdentifier.Count; ++i)
{
SecurityToken securityToken = ResolveSecurityToken(keyIdentifier[i]);
if (securityToken != null)
{
token = securityToken;
break;
}
}
return (token != null);
}
protected override bool TryResolveTokenCore(SecurityKeyIdentifierClause keyIdentifierClause, out SecurityToken token)
{
token = null;
SecurityToken securityToken = ResolveSecurityToken(keyIdentifierClause);
if (securityToken != null)
token = securityToken;
return (token != null);
}
SecurityToken ResolveSecurityToken(SecurityKeyIdentifierClause keyIdentifierClause)
{
if (!this.canMatchLocalId && keyIdentifierClause is LocalIdKeyIdentifierClause)
return null;
for (int i = 0; i < this.tokens.Count; ++i)
{
if (this.tokens[i].MatchesKeyIdentifierClause(keyIdentifierClause))
return this.tokens[i];
}
return null;
}
}
关于.net - 联合安全 - 单独的 SSL 和 RP 证书(.NET 4.5 和 WIF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24536091/
我试图了解 WIF 中主动和被动联合之间的区别。如果依赖方 (RP) 是 WCF 服务而不是 ASP.NET 应用程序,则似乎使用主动联合;如果 RP 是 ASP.NET 应用程序,则使用被动联合。这
新的路由服务如何处理安全性?根据http://blogs.microsoft.co.il/blogs/applisec/archive/2011/12/12/wcf-routing-and-messa
SessionAuthenticationModule 类中的事件之一是 SessionSecurityTokenReceived。这使我们能够查看从 AD FS 收到的 session token
SessionAuthenticationModule 类中的事件之一是 SessionSecurityTokenReceived。这使我们能够查看从 AD FS 收到的 session token
我需要安装 IdentityTrainingKitApril2020.VS2010,它让我安装 WindowsIdentityFoundation-SDK-4.0。 但设置 WIF SDK 失败并显示
我正在尝试为将使用 WIF 进行身份验证的 ASP.NET MVC3 应用程序开发身份验证插件。由于它是具有系统内配置的插件,因此我避免接触应用程序的 web.config 文件或其他任何内容。我已经
据我所知,在 WIF 1.0 中,Windows Identity 直接源自 IIdentity。在 WIF 4.5 中,Windows Identity 派生自实现 IIdentity 的 Clai
我很想知道我们如何可能从一个 WIF 应用程序发送一个安全 token ,该应用程序已经通过 WIF 启用的 WCF 服务的身份验证。 任何帮助都将得到认可 最佳答案 答案并不简单,但以下步骤构成了“
我已使用最新 WIF SDK(适用于 .NET 4.0)附带的被动和主动案例的项目模板成功创建了一个有效的自定义 STS。一切都按预期进行。 我现在正在尝试将我的 Web 应用程序和服务升级到 .NE
我正在考虑使用 Azure 访问控制来实现 SSO。但一些 Web 应用程序使用 .net 3.5。基于 Azure ACS 的 STS 是否支持 WIF 3.5 依赖方? 最佳答案 是的。这不是 A
我很难理解应该如何定义 claim 。网络上有很多关于创建声明的信息,但似乎没有一个是一致的。我在不同的帖子中发现了声明的四个属性: claim 类型 claim 值(value) 值类型 右 假设您
我一直在阅读有关 Windows Identity Foundation 的一些文章,并且对联邦提供程序有一些模糊的定义(可能是我的理解不准确)。但是,我没有看到一篇文章清楚地在身份提供者和联合提供者
我有一个 Web 应用程序,希望使用使用 Windows Identity Foundation 3.5 的自定义 STS 来保护它。所有示例在场景中都有一个被动 STS。为什么需要这个?如果您直接调
我正在尝试将声明感知 WCF 服务和客户端放在一起。 我正在使用 thinktecture Identity Server ,并且我通过查看“将 token 与 WCF/SOAP 一起使用”示例组装了
全部, 我一直在阅读很多有关基于声明的身份验证的内容,但仍然有些困惑。我试图巩固我的理解,特别是与SharePoint 2010/2013有关,但也与一般情况(即ASP.NET)有关。 我对各种技术术
我们有一个使用 WIF 的 ASP.NET 应用程序。我们的 web.config 文件有一个像这样的部分: 我看到的每个示例中,audienceUris 和 r
我们有一个现有的 ASP.NET 应用程序 (WebForms),它使用自行开发的身份验证。我们的任务是实现单点登录解决方案,并选择使用 WIF。 我们有一个正在运行的应用程序实例,我们通过使用子域(
在彻底搜索了 SO 的答案之后,这次我必须永远问我的第一个问题! 开始 : 我有一个 Windows 窗体应用程序,它使用十几个 WCF 服务来处理所有业务逻辑。 WIF 在每个 WCF 服务上实现,
我有一个站点是我们基于 WIF 的自定义 STS 的依赖方。我们最近实现了一个安全 token 缓存,如下所述:Azure/web-farm ready SecurityTokenCache .我们的
我们有一些应用程序可以使用表单例份验证通过传统的用户名/密码或电子邮件/密码方法进行身份验证。我们希望慢慢地将这些帐户迁移到 Windows Identity Foundation (WIF)。 将表
我是一名优秀的程序员,十分优秀!