使用瑞士E-ID Swiyu与Duende和.NET Aspire实现用户认证

本文详细介绍了如何使用Duende IdentityServer和ASP.NET Core Identity结合瑞士数字身份基础设施Swiyu进行用户认证,包含完整的技术架构、代码示例和实现流程。

使用Swiyu瑞士E-ID通过Duende和.NET Aspire认证用户

本文展示了如何使用Duende IdentityServer和ASP.NET Core Identity来验证用户身份,利用瑞士数字身份和信任基础设施(swiyu)验证可验证数字凭证。swiyu基础设施通过提供的通用容器实现,这些容器实现了OpenID for Verifiable Presentations标准以及许多其他实现可验证凭证的标准。

技术架构

使用可验证凭证是实现身份识别用例的好方法,但不适合实现认证流程。当需要高安全性时,应将用户身份识别与强认证流程结合使用,例如通行密钥认证和可验证凭证识别。

代码仓库: https://github.com/swiss-ssi-group/swiyu-idp-aspire-aspnetcore

设置

Duende身份服务器用作Web应用程序的OpenID Connect服务器。当用户进行身份验证时,瑞士E-ID可用于在身份提供者内部完成认证。应用程序使用.NET Aspire、ASP.NET Core Identity和瑞士公共测试版通用容器实现。

注册流程

使用swiyu注册时,使用以下四个声明来识别人:

  • birth_date
  • birth_place
  • family_name
  • given_name

注册端点需要已认证的用户。账户已经注册了电子邮件并创建了密码认证。然后可以添加E-ID,并将声明附加到此账户。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public async Task OnPostAsync()
{
    var presentation = await _verificationService
        .CreateBetaIdVerificationPresentationAsync();
        
    var verificationResponse = JsonSerializer.Deserialize<CreateVerificationPresentationModel>(presentation);
    QrCodeUrl = verificationResponse!.verification_url;
    
    var qrCode = QrCode.EncodeText(verificationResponse!.verification_url, QrCode.Ecc.Quartile);
    QrCodePng = qrCode.ToPng(20, 4, MagickColors.Black, MagickColors.White);
    
    VerificationId = verificationResponse.id;
}

UI开始轮询后端,检查验证是否完成。该过程在带外完成,与会话没有连接。这是一个问题,因为无法防止网络钓鱼。

认证流程

用户拥有账户,可以使用瑞士E-ID进行认证。用户和应用程序使用OpenID Connect从Web应用程序进行认证,并在身份提供者上使用存储在手机上的凭证的瑞士钱包进行认证。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public async Task<IActionResult> OnGet(string? returnUrl)
{
    if (returnUrl != null)
    {
        var context = await _interaction.GetAuthorizationContextAsync(returnUrl);
        ReturnUrl = returnUrl;
    }
    
    var presentation = await _verificationService
        .CreateBetaIdVerificationPresentationAsync();
        
    var verificationResponse = JsonSerializer.Deserialize<CreateVerificationPresentationModel>(presentation);
    QrCodeUrl = verificationResponse!.verification_url;
    
    var qrCode = QrCode.EncodeText(verificationResponse!.verification_url, QrCode.Ecc.Quartile);
    QrCodePng = qrCode.ToPng(20, 4, MagickColors.Black, MagickColors.White);
    
    VerificationId = verificationResponse.id;
    
    return Page();
}

注意事项

使用瑞士E-ID(Swiyu)进行身份识别是一个优秀的解决方案,但不是认证的好解决方案。这是弱认证,可能会被钓鱼。对于需要低级别认证的业务流程,这是一个可接受的风险。应该始终可以使用更强的方式进行认证,例如使用通行密钥。

适用场景

  • 注册
  • 入职
  • 恢复
  • 升级
  • 身份检查

相关标准

  • OpenID for Verifiable Credential Issuance
  • OpenID for Verifiable Presentations
  • Selective Disclosure JWT
  • Status List
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计