使用集成身份验证的ADFS Skip Home Realm Discovery

时间:2014-03-14 17:16:33

标签: asp.net active-directory adfs2.0

我的情景:

我有一个.net网络应用程序,人们使用表单身份验证登录应用程序,我的表单身份验证代码将某些用户发送到ADFS进行验证。我有多个联盟,包括我自己的内部用户的Active Directory服务器。因此,对于需要发送到ADFS进行身份验证的用户,我会这样做:

WSFederationAuthenticationModule instance = FederatedAuthentication.WSFederationAuthenticationModule;
SignInRequestMessage request = instance.CreateSignInRequest(Guid.NewGuid().ToString(), instance.Realm, true);
request.AuthenticationType = "urn:federation:authentication:windows";
//maybe you just don't need to specify the homerealm for ad, because there can only be one AD (integrated) trust?
//request.HomeRealm = "I-no-idea-what-to-put-here-for-AD";
Response.Redirect(request.WriteQueryString());

执行此操作时,设置.HomeRealm属性,该属性在查询字符串上为您填充whr属性。这应该使AD FS跳过HRD(Home Realm Discovery)页面。对于我的大多数联盟(远程STS),我非常清楚我需要在属性中放置什么值,您可以从HRD页面本身的下拉框中提取值,或者您可以进入AD FS管理工具并从信任属性中提取值。但是,对于AD信任,下拉列表中没有值(空字符串),您无法转到管理控制台中的属性。所以问题是这样的:如果我想通过whr参数预先选择AD信任,我将HomeRealm属性设置为什么?

P.S。你会在那里看到评论:"也许你不需要为广告指定homerealm,因为只能有一个AD(集成)信任?"我想可能就是这种情况,但我还没有证明这一点。如果我的猜测是正确的,我会稍后回答。

1 个答案:

答案 0 :(得分:2)

从原始问题中的代码:

    request.AuthenticationType = "urn:federation:authentication:windows";

该特定线条似乎没有任何效果。此外,希望不需要指定HomeRealm也是徒劳的。事实证明,您必须指定HomeRealm。在搜索谷歌一段时间后,我发现许多声明暗示Active Directory信任与信任ADFS服务器本身相同。因此,在黑暗中我疯狂地尝试放入ADFS服务器的URI,而且令我高兴和惊讶的是,这很有效。

所以,更清楚的是,如果你去依赖方的web.config,你应该设置类似的东西:

<issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry">
  <authority name="http://testadfs.test.com/adfs/services/trust">
    <keys>
      <add thumbprint="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
    </keys>
    <validIssuers>
      <add name="http://testadfs.test.com/adfs/services/trust" />
    </validIssuers>
  </authority>
</issuerNameRegistry>

我最终将request.HomeRealm的值设置为您在validIssuers和authority元素中看到的值。这给了我想要的效果,使ADFS自动选择Active Directory声明提供程序信任。

我应该清楚我的ADFS服务器不是域控制器,但这仍然有效。