如何让SecurityTokenHandler从web.config加载其配置?

时间:2018-02-13 20:08:23

标签: asp.net saml wif

我一直在努力尝试使用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中的东西加载其配置?

更新

我不再追求这种方法了。我仍然想知道这是如何运作的,但不再重要了。

1 个答案:

答案 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,但不能同时配置两者。