C# 使用AD/ADFS和.NET本机客户端的SSO

C# 使用AD/ADFS和.NET本机客户端的SSO,c#,single-sign-on,saml,adfs,wif,C#,Single Sign On,Saml,Adfs,Wif,我的问题是关于Active Directory(AD)、Active Directory联合服务(ADFS)、单点登录(SSO)和SAML的 我们有一个客户机/服务器应用程序,其规格如下: -客户端:基于.NET4.7.2和C的WPF.NET本机客户端# -服务器:基于JavaSpring的REST服务 一个主要需求是使用AD/ADFS的SSO。 在最好的情况下,应该对用户进行seamlessy/silent身份验证 主要限制是基于Windows Server 2012 R2的AD和ADFS 在

我的问题是关于Active Directory(AD)、Active Directory联合服务(ADFS)、单点登录(SSO)和SAML的

我们有一个客户机/服务器应用程序,其规格如下: -客户端:基于.NET4.7.2和C的WPF.NET本机客户端# -服务器:基于JavaSpring的REST服务

一个主要需求是使用AD/ADFS的SSO。 在最好的情况下,应该对用户进行seamlessy/silent身份验证

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

在下图中,您可以了解我们计划如何使用ADF实现SSO

  • .NET本机客户端尝试在没有身份验证的情况下使用REST服务
  • REST服务将.NET本机客户端重定向到ADFS服务器
  • .NET本机客户端尝试使用当前登录的用户凭据(Windows登录)获取SAML令牌
  • 如果当前用户ist授予ADFS服务器响应和SAML令牌
  • NET本机客户端获取SAML令牌并将其传递给REST服务
  • 如果接受SAML令牌,则授予用户访问权限
  • 如果不接受SAML令牌,则用户应在应用程序中获得登录屏幕
此时,我对.NET本机客户端中的SSO和ADF完全感到困惑。 我找不到任何合适的演示等。 许多演示或用例都是关于ASP.NET的,但几乎与本机客户端无关。 我开始怀疑我关于使用AD/ADFS和SAML的SSO的假设是否正确

我开始用中描述的虚拟机构建一个AD ADFS实验室。 然后我尝试使用ADFS服务器,但无法完成

我在看这个图书馆:

经过一周的研究,我的脑袋开始转动:

  • 我需要WIF吗
  • WCF呢
我知道有OAuth。我知道Windows Server 2012并不是这种情况下最新也是最好的。但要求和限制直接来自我们的客户

  • 我能做什么
  • 我可以阅读或尝试什么
  • 还有其他图书馆吗
  • 有什么例子吗
更新 我能够使用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令牌静音/无缝。

我认为您不需要WIF或WCF。你看过这本指南了吗@MarileeTurscak MSFT我已经检查了你发布的链接。问题是,我们的客户有Windows Server 2012 R2服务器。