c# - 使用 AD/ADFS 和 .NET Native Client 的 SSO
问题描述
我的问题是关于 Active Directory (AD)、Active Directory 联合服务 (ADFS)、Single Sing On (SSO) 和 SAML。
我们有一个具有以下规格的客户端/服务器应用程序: - 客户端:基于 .NET 4.7.2 和 C# 的 WPF .NET Native Client - 服务器:基于 Java Spring 的 REST-Service
一项主要要求是带有 AD/ADFS 的 SSO。在最佳情况下,用户应该无缝/静默地进行身份验证。
主要限制是基于 Windows Server 2012 R2 的 AD 和 ADFS。
在下图中,您可以了解我们计划如何使用 ADFS 实施 SSO。
- .NET Native Client 尝试使用没有身份验证的 REST 服务。
- REST-Service 将 .NET Native Client 重定向到 ADFS-Server。
- .NET Native Client 尝试使用当前登录的用户凭据(Windows 登录)获取 SAML 令牌。
- 如果当前用户被授予 ADFS-Server 响应和 SAML-Token。
- .NET Native Client 获取 SAML-Token 并将其传递给 REST-Service。
- 如果接受 SAML 令牌,则授予用户访问权限。
- 如果不接受 SAML 令牌,则用户应在应用程序中获得登录屏幕。
目前,我对 .NET Native Client 中的 SSO 和 ADFS 完全感到困惑。我找不到任何合适的演示等。许多演示或用例都与 ASP.NET 有关,但几乎与本机客户端无关。我开始怀疑我对带有 AD/ADFS 和 SAML 的 SSO 的假设是否不正确。
我开始使用了解 ADFS 和 ADFS 简介中描述的虚拟机构建 AD-ADFS-Lab 。然后我尝试使用 ADFS-Server 但无法完成。
我在看这个库:
经过 1 周的研究,我的脑袋开始旋转:
- 我需要WIF吗?
- WCF 呢?
我知道有 OAuth。我知道 Windows Server 2012 并不是最适合这个场景的最新版本。但要求和限制直接来自我们的客户。
- 我能做些什么?
- 我可以阅读或尝试什么?
- 还有其他图书馆吗?
- 有没有示例?
更新
我能够使用 WS-Trust 与我的 ADFS-Server “对话”并获得 SAML-Token。
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-Token 静音/无缝。
解决方案
推荐阅读
- visual-studio - 如何更改 Visual Studio 中的调试图标?
- typescript - 带有 ArgumentTypes 的 n 参数的 Typescript 类型安全 curry 函数
- c - 为什么这个结构类型“不完整”,它真的用指针解决了吗?
- c - Java Swing “包” - GTK 等价物
- dockerfile - SecurityException 在 Docker 容器中使用 Centos/OpenJDK11/Tomcat 加载 JAAS 配置文件
- tensorflow - 将 Tensorflow Estimators 与 Dataset API 一起使用会导致奇怪的步骤行为
- c++ - 如何从小于特定值的向量中获取前 3 个值?
- c# - Exception.Cannot 打印异常字符串的问题,因为 Exception.ToString() 失败
- python - 如何在 Apple M1 芯片上导入 Pandas
- css - 如何为多个 React 项目添加通用样式表存储库?