4

当我正在开发 WCF Web 服务以在用户的​​登录操作与其活动目录角色和权限之间建立中介时。我不希望我的主机应用程序直接与 AD FS 对话。我希望任何主机应用程序都可以使用我的 Web 服务,它会根据给定的凭据提供必要的信息。

在我的网络方法中,我需要通过用户的登录凭据从 AD FS (WIF) 获取声明。

我的 web 方法将有两个输入参数,Window 用户的电子邮件 ID/Windows 帐户名和密码。

因此,我想通过给定用户的凭据在我的 Web 方法中访问 AD FS 声明。

如何通过给定用户的凭据获得 AD FS 声明?

4

2 回答 2

7

您应该对使用集成 Windows 身份验证的 AD FS 2.0 的 https://.../adfs/services/trust/13/usernamemixed 端点执行 Web 服务调用,提供用户凭据以便可以设置连接。在此端点上,调用http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue操作。(更多详细信息在WS-Trust 1.3 规范的第 4.1 节中。)此操作的输入是 RequestSecurityToken 请求。响应包含一个 SAML 令牌,其中包含您需要的声明。

请注意,AD FS 2.0 WSDL 在 https://.../adfs/services/trust/mex 上可用:如果您将 Visual Studio添加服务引用向导或 Java wsimport指向该 URL,那么您将很容易生成可用于执行 RST 问题操作的客户端代码。

于 2012-06-11T19:35:07.253 回答
5

您可以从 ADFS 请求 DisplayTokem 并使用它,它与您在令牌中的信息基本相同。

public DisplayClaimCollection GetDisplayClaims(string username, string password)
        {
            WSTrustChannelFactory factory = null;
            try
            {

                // use a UserName Trust Binding for username authentication
                factory = new WSTrustChannelFactory(
                    new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
                    "https://.../adfs/services/trust/13/usernamemixed");

                factory.TrustVersion = TrustVersion.WSTrust13;


                factory.Credentials.UserName.UserName = username;
                factory.Credentials.UserName.Password = password;


                var rst = new RequestSecurityToken
                              {
                                  RequestType = RequestTypes.Issue,
                                  AppliesTo = "Relying party endpoint address",
                                  KeyType = KeyTypes.Symmetric,
                                  RequestDisplayToken = true
                              };

                IWSTrustChannelContract channel = factory.CreateChannel();
                RequestSecurityTokenResponse rstr;
                SecurityToken token = channel.Issue(rst, out rstr);

                return rstr.RequestedDisplayToken.DisplayClaims;
            }
            finally
            {
                if (factory != null)
                {
                    try
                    {
                        factory.Close();
                    }
                    catch (CommunicationObjectFaultedException)
                    {
                        factory.Abort();
                    }
                }
            }
        }

但这不是正确的做法!您应该使用您的 RelyingParty 证书来解密加密的令牌并从中读取声明。

于 2012-06-12T07:47:31.737 回答