具有AD / ADFS和.NET本机客户端的SSO

时间:2019-02-14 09:55:48

标签: c# single-sign-on saml adfs wif

我的问题与Active Directory(AD),Active Directory联合身份验证服务(ADFS),Single Sing On(SSO)和SAML有关。

我们有一个具有以下规格的客户端/服务器应用程序: -客户端:基于.NET 4.7.2和C#的WPF .NET本机客户端 -服务器:基于Java Spring的REST服务

一个主要要求是带有AD / ADFS的SSO。 在最佳情况下,应该对用户进行无缝/静音身份验证。

主要限制是基于Windows Server 2012 R2的AD和ADFS。

在下面的图片中,您可以了解我们计划如何使用ADFS实施SSO。

SSO-Scenario

  • .NET本机客户端尝试使用未经身份验证的REST服务。
  • REST服务将.NET本机客户端重定向到ADFS服务器。
  • .NET本机客户端尝试使用当前登录的用户凭据(Windows登录)获取SAML令牌。
  • 如果当前授予“授权给ADFS-Server的用户”使用SAML令牌进行响应。
  • .NET本机客户端获取SAML令牌,并将其传递给REST服务。
  • 如果SAML令牌被接受,则授予用户访问权限。
  • 如果未接受SAML令牌,则用户应在应用程序中获得一个登录屏幕。

这时,我对.NET Native Client中的带有ADFS的SSO完全感到困惑。 我找不到任何合适的演示等。 许多演示或用例都与ASP.NET有关,但与本地客户端无关。 我开始怀疑我对带有AD / ADFS和SAML的SSO的假设是否成立。

我开始使用Understanding ADFS an Introduction to ADFS中所述的虚拟机构建AD-ADFS-Lab。 然后,我尝试使用ADFS服务器,但无法完成。

我正在看这些图书馆:

研究1周后,我的头在旋转:

  • 我需要WIF吗?
  • WCF呢?

我知道有OAuth。我知道Windows Server 2012并非针对这种情况的最新版本。但是要求和限制直接来自我们的客户。

  • 我该怎么办?
  • 我可以阅读或尝试什么?
  • 还有其他图书馆吗?
  • 有没有Examplex?

更新

我能够通过WS-Trust与我的ADFS服务器进行对话并获得SAML令牌。

private static void Main(string[] args)
    {
        string adfs = "https://ad-fs.adlab.local";
        string adfsEndpoint = "https://ad-fs.adlab.local/adfs/services/trust/13/usernamemixed";
        string appServer = "https://ad-server.adlab.local/sampapp/";

        var factory = new WSTrustChannelFactory(new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), adfsEndpoint);
        factory.TrustVersion = TrustVersion.WSTrust13;

        var channelCredentials = factory.Credentials;

        channelCredentials.UserName.UserName = "Administrator@adlab";
        channelCredentials.UserName.Password = "SsoLab2019";
        channelCredentials.SupportInteractive = false;

        RequestSecurityToken rst = new RequestSecurityToken
        {
            RequestType = RequestTypes.Issue,
            AppliesTo = new EndpointReference(appServer),
            KeyType = KeyTypes.Bearer
        };

        var channel = factory.CreateChannel();

        try
        {
            var token = (GenericXmlSecurityToken)channel.Issue(rst);
            Console.Write(token.TokenXml.OuterXml);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.ReadKey();
    }

否,我不必弄清楚如何使SAML令牌保持静音/无缝。

0 个答案:

没有答案