如何让 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.