如何让 SecurityTokenHandler 从 web.config 加载其配置?
How do I get a SecurityTokenHandler to load its configuration from web.config?
我一直在努力尝试使用 WIF 将 SAML2 SSO 入口点添加到 asp.net 4.6 网络应用程序——开始之前我完全不熟悉这项技术。到目前为止有效的是以编程方式创建所有内容,为此我已经对各种对象类型进行了子类化,例如 Saml2SecurityTokenHandler 和 X509CertificateValidator 以及 IssuerNameRegistry,并且为此处理程序我从头开始构建了一个 SecurityTokenHandlerConfiguration 对象。但我注意到,正确的方法是从 web.config 或 app.config 加载 SecurityTokenHandlerConfiguration,因为这是在侧面组件中而不是网站本身。
如果我能让它工作,我就可以删除很多我一直在用胶带粘在一起的程序化的东西。所以我开始将必要的部分放在 web.config 中。我将 identityModel 部分添加到 configSections 标记,并在我的配置中添加了类似这样的内容:
<system.identityModel>
<identityConfiguration>
<tokenReplayDetection enabled="true" />
<audienceUris>
<add value="http://myurl.com" />
</audienceUris>
<issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089">
<trustedIssuers>
<add thumbprint="1234123412341234ABCDABCDABCDABCD00000001" name="theirurl.com" />
</trustedIssuers>
</issuerNameRegistry>
</identityConfiguration>
</system.identityModel>
我也试过这样设置,看起来应该正好符合我的需要:
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<securityTokenHandlerConfiguration>
<tokenReplayDetection enabled="true" />
<audienceUris mode="Always">
<add value="http://myurl.com" />
</audienceUris>
<issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089">
<trustedIssuers>
<add thumbprint="1234123412341234ABCDABCDABCDABCD00000001" name="theirurl.com" />
</trustedIssuers>
</issuerNameRegistry>
</securityTokenHandlerConfiguration>
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
问题是我似乎无法弥合配置和代码之间的差距。似乎没有什么可以自动加载它,而且我找不到任何有关如何手动加载它的有用信息。似乎整个部分都被忽略了。如果需要 "load config" 步骤,我找不到它的描述。
如何构建 Saml2SecurityTokenHandler 的实例,并从 app.config 中的内容加载其配置?
更新
我不再追求这种方法。我仍然有点想知道它是如何工作的,但已经不重要了。
通过创建 IdentityConfiguration 的实例,它将从配置中读取您的设置。默认构造函数将执行此操作,但还有一个构造函数重载可让您明确指定此操作 (new IdentityConfiguration(true)
)。如果没有 配置元素,那个也会给你一个例外。
如果您尚未清除 SecurityTokenHandler 集合,您将能够通过您的 IdentityConfiguration 实例的 SecurityTokenHandlers 属性 访问其中的各种集合。这对我来说是正确的,所以我必须搜索我正在寻找的处理程序。
在我的例子中,我想读取 SessionSecurityTokenHandler 的 TokenLifeTime 属性(另外使用 System.Linq):
System.IdentityModel.Tokens.SessionSecurityTokenHandler sessionSecurityTokenHandler =
new IdentityConfiguration(true)
.SecurityTokenHandlers
.SingleOrDefault(sth => sth.TokenType == typeof(System.IdentityModel.Tokens.SessionSecurityToken))
as System.IdentityModel.Tokens.SessionSecurityTokenHandler;
TimeSpan tokenLifeTime = sessionSecurityTokenHandler.TokenLifetime;
我的配置是这样的:
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<sessionTokenRequirement lifetime="01:00" />
</add>
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
来自securityTokenHandlers documentation:
By default, the collection is populated with the following handler types: SamlSecurityTokenHandler, Saml2SecurityTokenHandler, KerberosSecurityTokenHandler, WindowsUserNameSecurityTokenHandler, RsaSecurityTokenHandler, X509SecurityTokenHandler, and EncryptedSecurityTokenHandler. You can modify the collection by using the add, remove, and clear elements. You must ensure that only a single handler of any particular type exists in the collection. For example, if you derive a handler from the Saml2SecurityTokenHandler class, either your handler or the Saml2SecurityTokenHandler may be configured in a single collection, but not both.
我一直在努力尝试使用 WIF 将 SAML2 SSO 入口点添加到 asp.net 4.6 网络应用程序——开始之前我完全不熟悉这项技术。到目前为止有效的是以编程方式创建所有内容,为此我已经对各种对象类型进行了子类化,例如 Saml2SecurityTokenHandler 和 X509CertificateValidator 以及 IssuerNameRegistry,并且为此处理程序我从头开始构建了一个 SecurityTokenHandlerConfiguration 对象。但我注意到,正确的方法是从 web.config 或 app.config 加载 SecurityTokenHandlerConfiguration,因为这是在侧面组件中而不是网站本身。
如果我能让它工作,我就可以删除很多我一直在用胶带粘在一起的程序化的东西。所以我开始将必要的部分放在 web.config 中。我将 identityModel 部分添加到 configSections 标记,并在我的配置中添加了类似这样的内容:
<system.identityModel>
<identityConfiguration>
<tokenReplayDetection enabled="true" />
<audienceUris>
<add value="http://myurl.com" />
</audienceUris>
<issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089">
<trustedIssuers>
<add thumbprint="1234123412341234ABCDABCDABCDABCD00000001" name="theirurl.com" />
</trustedIssuers>
</issuerNameRegistry>
</identityConfiguration>
</system.identityModel>
我也试过这样设置,看起来应该正好符合我的需要:
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<securityTokenHandlerConfiguration>
<tokenReplayDetection enabled="true" />
<audienceUris mode="Always">
<add value="http://myurl.com" />
</audienceUris>
<issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089">
<trustedIssuers>
<add thumbprint="1234123412341234ABCDABCDABCDABCD00000001" name="theirurl.com" />
</trustedIssuers>
</issuerNameRegistry>
</securityTokenHandlerConfiguration>
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
问题是我似乎无法弥合配置和代码之间的差距。似乎没有什么可以自动加载它,而且我找不到任何有关如何手动加载它的有用信息。似乎整个部分都被忽略了。如果需要 "load config" 步骤,我找不到它的描述。
如何构建 Saml2SecurityTokenHandler 的实例,并从 app.config 中的内容加载其配置?
更新
我不再追求这种方法。我仍然有点想知道它是如何工作的,但已经不重要了。
通过创建 IdentityConfiguration 的实例,它将从配置中读取您的设置。默认构造函数将执行此操作,但还有一个构造函数重载可让您明确指定此操作 (new IdentityConfiguration(true)
)。如果没有
如果您尚未清除 SecurityTokenHandler 集合,您将能够通过您的 IdentityConfiguration 实例的 SecurityTokenHandlers 属性 访问其中的各种集合。这对我来说是正确的,所以我必须搜索我正在寻找的处理程序。
在我的例子中,我想读取 SessionSecurityTokenHandler 的 TokenLifeTime 属性(另外使用 System.Linq):
System.IdentityModel.Tokens.SessionSecurityTokenHandler sessionSecurityTokenHandler =
new IdentityConfiguration(true)
.SecurityTokenHandlers
.SingleOrDefault(sth => sth.TokenType == typeof(System.IdentityModel.Tokens.SessionSecurityToken))
as System.IdentityModel.Tokens.SessionSecurityTokenHandler;
TimeSpan tokenLifeTime = sessionSecurityTokenHandler.TokenLifetime;
我的配置是这样的:
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<sessionTokenRequirement lifetime="01:00" />
</add>
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
来自securityTokenHandlers documentation:
By default, the collection is populated with the following handler types: SamlSecurityTokenHandler, Saml2SecurityTokenHandler, KerberosSecurityTokenHandler, WindowsUserNameSecurityTokenHandler, RsaSecurityTokenHandler, X509SecurityTokenHandler, and EncryptedSecurityTokenHandler. You can modify the collection by using the add, remove, and clear elements. You must ensure that only a single handler of any particular type exists in the collection. For example, if you derive a handler from the Saml2SecurityTokenHandler class, either your handler or the Saml2SecurityTokenHandler may be configured in a single collection, but not both.