Passkey、SAML SSO、LDAP 与 TOTP 双因素认证:Delphi 登录组件

· 组件
Passkey、SAML SSO、LDAP 与 TOTP 双因素认证:Delphi 登录组件

登录界面是企业应用中每个客户都有意见的部分。我们能用 Entra ID 账户登录吗?它支持 passkey 吗?我们的审计人员想要双因素认证。我们的用户已经在 Active Directory 中了,为什么还需要另一个密码?而你的应用发送的邮件,在 Microsoft 365 拒绝 SMTP 设置中的密码那天就停止工作了。

这些问题中的每一个都是一个协议,有自己的规范、自己的 XML 或 ASN.1,以及各自“几乎正确”的方式。全新的企业身份验证组件以 Delphi 组件的形式回答了这些问题。它们包含在 sgcWebSockets 的EnterpriseAll-Access 版本以及 sgcAuth 组件包中,同样的组件也是 sgcWebSockets .NET 的一部分。

按用户期望的方式实现 Passkey

WebAuthn 服务器现在涵盖了人们谈到 passkey 时真正的含义:

SAML 单点登录

大客户不希望自己的员工在你的应用中拥有账户,他们希望使用公司已经在用的身份提供商登录。TsgcSAMLServiceProvider 让你的应用成为面向 Entra ID、Okta、AD FS、Google Workspace 和 Keycloak 的 SAML 2.0 服务提供方。身份提供商负责登录,你的应用接收一个断言(assertion),在你看到用户名之前,该断言的签名就已经过验证。

Active Directory 与 LDAP 登录

对于在公司内网中运行的应用,用户已经有一个密码:他们的 Windows 密码。TsgcLDAPClient 通过 LDAPS 或 StartTLS 对照 Active Directory 或任意 LDAP 目录校验用户名和密码,确保密码不会以明文方式经过网络传输。将 Security 设置为 ldapsecLDAPSldapsecStartTLS,然后调用 Authenticate

知道用户是谁只回答了一半的问题。GetUserGroups 会返回该账户所属的所有组,包括嵌套组,这样“该用户是否为发票审批人”这样的问题就变成了一次调用,而不是你自己编写和调试的递归查询。

来自身份验证器应用的双因素验证码

TsgcTOTPAuthenticator 生成并验证 Google Authenticator、Microsoft Authenticator 以及其他任何 TOTP 应用的六位数验证码。注册过程只需一个密钥和一个以二维码形式展示的 URI。登录只需一次调用:

uses
  sgcAuth_TOTP, sgcBase_Helpers;

var
  oTOTP: TsgcTOTPAuthenticator;
  vSecret, vURI: string;
  vLastStep: Int64;
begin
  oTOTP := TsgcTOTPAuthenticator.Create(nil);
  try
    oTOTP.Issuer := 'MyApp';

    // enrolment: store vSecret with the user, show vURI as a QR code
    vSecret := oTOTP.GenerateSecret;
    vURI := oTOTP.GetProvisioningURI('john@example.com', vSecret);

    // sign-in: vLastStep is the last step accepted for this user, -1 the first time
    vLastStep := -1;
    if oTOTP.VerifyCode(vSecret, txtCode.Text,
      StrToInt64(GetDateTimeUnix(Now)), vLastStep) then
      ShowMessage('Signed in') // save vLastStep, this code is now spent
    else
      ShowMessage('Wrong, expired or already used');
  finally
    oTOTP.Free;
  end;
end;

这个重载方法就是重放保护:一个已经被接受过的验证码会被拒绝,即使还在它自己的三十秒有效期内,因此被人从背后偷看到的验证码在使用之后就毫无价值了。为了应对手机丢失的那一天,GenerateRecoveryCodes 会生成一份一次性恢复码列表。请像保管密码一样保管它们。

使用 OpenID Connect 登录

TsgcHTTP_OIDC_Client 可让用户使用任意 OpenID Connect 提供商登录。它会读取提供商的发现文档,因此配置只需一个颁发者 URL 和一个客户端 ID,而不是手动复制的一份端点列表。它会验证收到的 ID 令牌,同样的签名密钥也会验证到达你自己 REST API 的持有者令牌,包括来自 Entra ID 多租户应用的令牌,其中每个客户租户都使用自己的颁发者签名。

面向 Microsoft 365 和 Gmail 邮件的 OAuth2

Microsoft 365 和 Gmail 要求 SMTP、IMAP 和 POP3 使用 OAuth2,而不是密码。TsgcMailOAuth2 获取访问令牌、刷新令牌,并构建供你的 SMTP、IMAP 或 POP3 会话登录所用的 XOAUTH2 字符串。选择提供商和协议,提供你的客户端 ID,并在 OnTokensChanged 触发时保存刷新令牌。没有浏览器的服务或控制台应用可以改用设备代码流程。

试用演示程序

每个组件在 Demos\26.Authentication 中都有一个可运行的演示程序:

文档

获取方式

这些组件包含在 sgcWebSockets 的 Enterprise 和 All-Access 版本中,支持 Delphi、C++ Builder 和 .NET。如果你只需要身份验证功能,sgcAuth 组件包 也单独提供这些组件。它们是增量式的:在你把某个组件拖到窗体上之前,现有应用中的任何内容都不会改变。

延伸阅读

观看视频

eSeGeCe 频道上有一段短视频,标题为 “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”,发布在 eSeGeCe 频道

有问题、反馈,或需要帮助将其集成到你的登录页面?联系我们。你将收到编写这段代码的人员的回复。