如何从 ADFS 服务器获取 SAML 令牌,以在 C# 中从动态 CRM 本地(非 SDK)中提取数据?

问题描述 投票:0回答:3

我尝试从 ADFS 获取 SAML 令牌,以从本地 CRM(非 sdk)提取数据,但我不知道如何操作..我认为我需要向 ADFS 发出 SOAP 请求才能获取 SAML 令牌通过使用 postasync 方法,然后我认为我需要将令牌放入 http 标头中,如下所示,以从 CRM 中提取数据。

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("承载者", TOKEN);

https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/developers-guide/gg327838(v=crm.8)

https://community.dynamics.com/crm/f/microsoft-dynamics-crm-forum/255985/crm2016-afds-authentication

https://gist.github.com/jlattimer/7b0ee146badfc57fc9c9

我已经阅读了上面的三个链接(以及其他内容),并尝试了它们,但似乎前两个仅适用于 sdk,不适用于非 sdk。 而且,github 上的东西也不适合我。我想知道是否有另一种方法来生成 SOAP 请求,而不是像第三个链接那样输入所有内容。

c# dynamics-crm saml adfs
3个回答
1
投票

ADFS 是一个身份提供商 (IDP) 并实现:

  • OpenID 连接
  • WS-美联储
  • SAML

您的客户必须实现这三种协议之一。

你不能使用 SOAP。

对于 OpenID Connect (OIDC),您可以使用 REST API,但这会为您提供 JWT,而不是 SAML 令牌。

一旦您通过 OIDC 获得访问令牌,您就可以按照您的描述将其添加为(“Bearer”,TOKEN)。

良好的概述示例


0
投票

我知道有两种方法。 在这两种方式中,您都需要将应用程序作为 RPT 添加到 ADFS。 检查这个:https://learn.microsoft.com/ru-ru/windows-server/identity/ad-fs/operations/create-a-relying-party-trust 不要忘记启用 saml 协议并设置断言消费者端点。

解决方案一:

只需将所有未经授权的用户重定向到 https://your.adfs.instance/adfs/ls/IDpInitiatedSignon.aspx 他们将提供凭据,然后被要求选择要重定向的应用程序。如果您将在 url 中使用中继状态来指定应用程序,则将别无选择。之后,ADFS 将向为 RPT 指定的端点发送 SAML 响应。如果您使用 .NET,则可以使用 WS-Fed 模块,该模块将自动执行此数据流。

解决方案二:

您可以在后端执行相同的操作。 这是 .NET 的实现: https://blogs.msdn.microsoft.com/rodneyviana/2014/04/21/how-to-get-a-saml-protocol-response-from-adfs-using-c/

此外,您可以直接调用 ADFS,它更加原生,但我不保证它将是 SAML 令牌。以下是示例:使用 Active Directory 在 C# 中进行身份验证

UPD。我再次阅读了您的问题,不确定这是否是您所需要的。


0
投票
//This code will get you the SAML Token for SAP Odata Services in C# 
protected HttpClient Client
{
    get
    {
        if (client == null)
        {
            handler = new HttpClientHandler();

            handler.Credentials = new NetworkCredential(username, password);
            handler.AllowAutoRedirect = false;
            handler.CookieContainer = cookies;
            handler.UseCookies = true;
            client = new HttpClient(handler);
            client.MaxResponseContentBufferSize = 9999999;
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
            client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
            client.DefaultRequestHeaders.ExpectContinue = false;
        }
        return client;
    }
}
public String GetSAML()
{    
    if (client != null)
    {
        client = null;
    }
    String text = "";
    String SAMLTokenBase64String="";
    String urlRelayParty = "Your_Relay_party_identifier";
    string url = String.Format("{0}?loginToRp={1}", "https://***yourdomainforstsoradfs*****.com/adfs/ls/IdpInitiatedSignOn.aspx", HttpUtility.UrlEncode(urlRelayParty));
    do
    {
        result = Client.GetAsync(url).GetAwaiter().GetResult();
        text = result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
        IEnumerable<string> values;
        if (result.Headers.TryGetValues("location", out values))
        {
            foreach (string s in values)
            {
                if (s.StartsWith("/"))
                {
                    url = url.Substring(0, url.IndexOf("/adfs/ls")) + s;
                }
                else
                    url = s;
            }
        }
        else
        {
            url = "";
        }
    }
    while (!String.IsNullOrEmpty(url));

    Regex reg = new Regex("SAMLResponse\\W+value\\=\\\"([^\\\"]+)\\\"");
    MatchCollection matches = reg.Matches(text);
    foreach (Match m in matches)
    {
        SAMLTokenBase64String = m.Groups[1].Value;
    }

    if (SAMLTokenBase64String != null && SAMLTokenBase64String.Trim().Length > 0)
    {
        SB("STS Login Successfull for " + urlRelayParty);
        return SAMLTokenBase64String;
    }
    

    SB("STS Login Failed for " + urlRelayParty);
    return "";
}
© www.soinside.com 2019 - 2024. All rights reserved.