【问题标题】:How to access AD FS claims by User's credential?如何通过用户凭据访问 AD FS 声明?
【发布时间】:2012-06-14 09:57:19
【问题描述】:

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

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

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

所以,我想通过给定用户的凭据在我的网络方法中访问 AD FS 声明。

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

【问题讨论】:

    标签: c# .net wcf web-services adfs2.0


    【解决方案1】:

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

    请注意,AD FS 2.0 WSDL 在 https://.../adfs/services/trust/mex 上可用:如果您将 Visual Studio Add Service Reference 向导或 Java wsimport 指向该 URL然后您将轻松生成可用于执行 RST 问题操作的客户端代码。

    【讨论】:

    • 你好@Marnix,我已经使用 [SecurityToken token = channel.Issue(rst);] 来发布安全令牌,但它没有向我提供声明。您能否让我知道我如何通过“https://.../adfs/services/trust/13/usernamemixed”电话获得索赔?
    • 好的,所以你肯定是在正确的轨道上。不幸的是,我对 WCF 安全模型的了解还不够,无法在此处进一步帮助您;对不起。
    • 我相信 WCF 也不是这里的情况,假设我正在通过 Asp.Net MVC 4 的新功能开发服务 - 一个 Web API .. 我们可以从 AD FS 获得索赔吗如果我使用 MVC4 Web API?
    【解决方案2】:

    您可以从 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 证书来解密加密的令牌并从中读取声明。

    【讨论】:

    • @Floarin 非常感谢您的回答。我在这里得到两件事.... 1) [rstr.RequestedDisplayToken.DisplayClaims;] 在这里,我的 SecurityToken 对象无法使用 RequestedDisplayToken。我收到编译错误。 2)能否请您告诉我,我将使用 RelyingParty 证书加密/解密令牌并通过代码读取声明?提前感谢!
    • @nunu:我改了代码,你得自己添加AppliesTo地址,你得到的编译错误是什么?我现在将检查令牌解密代码。
    • @Floarin,请跳过我的观点。 1 现在.. 编译错误得到解决.. 是的.. 请让我知道您对第 1 点的想法。 2 谢谢!
    • @Floarin,非常感谢您的回答!编译错误得到了解决,它只是因为我没有声明 [RequestSecurityTokenResponse] 对象而存在。所以它已经解决了......但请提供一些关于加密/解密令牌的信息并阅读它的声明..期待您的回复!谢谢..
    • 我没有解密令牌的源代码,通常您不必担心,因为 WIF 会为您完成。看看这里:msdn.microsoft.com/en-us/library/aa967562(v=vs.90).aspx
    猜你喜欢
    • 2013-06-07
    • 2020-04-29
    • 1970-01-01
    • 2020-05-17
    • 2021-12-08
    • 2021-11-13
    • 2018-02-08
    • 2020-03-25
    • 2014-11-28
    相关资源
    最近更新 更多