登录界面是企业应用中每个客户都有意见的部分。我们能用 Entra ID 账户登录吗?它支持 passkey 吗?我们的审计人员想要双因素认证。我们的用户已经在 Active Directory 中了,为什么还需要另一个密码?而你的应用发送的邮件,在 Microsoft 365 拒绝 SMTP 设置中的密码那天就停止工作了。
这些问题中的每一个都是一个协议,有自己的规范、自己的 XML 或 ASN.1,以及各自“几乎正确”的方式。全新的企业身份验证组件以 Delphi 组件的形式回答了这些问题。它们包含在 sgcWebSockets 的Enterprise 和All-Access 版本以及 sgcAuth 组件包中,同样的组件也是 sgcWebSockets .NET 的一部分。
按用户期望的方式实现 Passkey
WebAuthn 服务器现在涵盖了人们谈到 passkey 时真正的含义:
- 无需用户名登录。用户只需按一个按钮,浏览器就会提供它为你的网站保存的 passkey,账户由凭据本身识别。无需输入任何内容。
- 自动填充。Passkey 会出现在浏览器自身的建议列表中,位于用户名字段旁,与已保存的密码并列,因此登录页面可以在用户过渡期间同时提供两种方式。
- 每个用户可拥有多个 passkey。手机上一个,笔记本电脑上一个,抽屉里还有一个硬件密钥,以备两者都丢失的那一天。
- 同步 passkey 检测。服务器会区分由平台备份并同步的 passkey 与绑定到单一设备的 passkey,这样你的策略就可以对它们区别对待。
- 使用你自己的数据库。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 设置为 ldapsecLDAPS 或 ldapsecStartTLS,然后调用 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 中都有一个可运行的演示程序:
01.Passkeys,浏览器中的无用户名登录与自动填充。02.TOTP,通过二维码注册、验证与恢复码。03.SAML_ServiceProvider,对接你的身份提供商实现单点登录。04.OpenID_Connect,登录与令牌验证。05.LDAP_ActiveDirectory,登录与组成员关系。06.Mail_OAuth2,通过 OAuth2 从 Microsoft 365 或 Gmail 发送邮件。
文档
- Passkeys
- TsgcSAMLServiceProvider
- TsgcLDAPClient
- TsgcTOTPAuthenticator
- TsgcHTTP_OIDC_Client
- TsgcMailOAuth2
获取方式
这些组件包含在 sgcWebSockets 的 Enterprise 和 All-Access 版本中,支持 Delphi、C++ Builder 和 .NET。如果你只需要身份验证功能,sgcAuth 组件包 也单独提供这些组件。它们是增量式的:在你把某个组件拖到窗体上之前,现有应用中的任何内容都不会改变。
延伸阅读
观看视频
eSeGeCe 频道上有一段短视频,标题为 “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”,发布在 eSeGeCe 频道。
有问题、反馈,或需要帮助将其集成到你的登录页面?联系我们。你将收到编写这段代码的人员的回复。
