我一直在努力尝试使用WIF将一个SAML2 SSO入口点添加到asp.net 4.6 Web应用程序 - 这是我在开始之前完全不熟悉的技术。到目前为止工作的是以编程方式创建所有内容,为此我已经将各种对象类型(如Saml2SecurityTokenHandler和X509CertificateValidator和IssuerNameRegistry)子类化,并且对于此处理程序,我从头开始构建SecurityTokenHandlerConfiguration对象。但我注意到这样做的正确方法是从web.config加载SecurityTokenHandlerConfiguration,或者更确切地说是app.config加载,因为这是在侧组件而不是网站本身。
如果我可以将其付诸实践,我可以删除很多程序化的东西,我已经将它们捆绑在一起。所以我开始在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>
问题在于我似乎无法弥合配置和代码之间的差距。似乎没有任何东西自动加载,我无法找到有关如何手动加载它的任何有用信息。似乎整个部分都被忽略了。如果有&#34;加载配置&#34;我需要的步骤,我无法找到它所描述的位置。
如何构建Saml2SecurityTokenHandler的实例,并从app.config中的东西加载其配置?
我不再追求这种方法了。我仍然想知道这是如何运作的,但不再重要了。
答案 0 :(得分:1)
通过创建IdentityConfiguration的实例,它将从配置中读取您的设置。默认的构造函数将执行此操作,但是也有构造函数重载,可让您显式指定此内容(new IdentityConfiguration(true)
)。如果没有
如果您尚未清除SecurityTokenHandlers的集合,则可以通过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:
默认情况下,该集合使用以下处理程序类型填充:SamlSecurityTokenHandler,Saml2SecurityTokenHandler,KerberosSecurityTokenHandler,WindowsUserNameSecurityTokenHandler,RsaSecurityTokenHandler,X509SecurityTokenHandler和EncryptedSecurityTokenHandler。您可以使用添加,删除和清除元素来修改集合。您必须确保集合中仅存在任何特定类型的单个处理程序。例如,如果您从Saml2SecurityTokenHandler类派生处理程序,则可以在单个集合中配置您的处理程序或Saml2SecurityTokenHandler,但不能同时配置两者。