返回

在C#类库中验证SAML令牌的最佳实践

windows

在 C# 类库中验证 SAML 令牌:使用 Windows 标识联合 (WIF) 的指南

问题陈述

在 C# 类库(而不是 MVC 项目)中验证安全断言标记语言 (SAML) 令牌是一项独特的挑战。由于类库中不存在 web.config 文件,因此通常用于验证 SAML 令牌的 Windows 标识联合 (WIF) 框架方法不起作用。

方法

自定义配置节

一种解决方案是创建一个自定义配置节,其中包含类库所需的配置信息,例如可接受的令牌颁发者和受众。然后,使用 ConfigurationManager 类从代码中访问此配置。

手动验证

如果您不想创建自定义配置节,则可以使用 System.IdentityModel.Tokens 库手动验证 SAML 令牌。这个库包含用于验证 SAML 令牌的类。

手动验证步骤

  1. 使用 Saml2SecurityTokenHandler 加载令牌。
  2. 验证签名。
  3. 验证颁发者和受众。
  4. 检查声明属性以获取用户身份信息。

示例代码

public ClaimsPrincipal ValidateSamlToken(string tokenString)
{
    // 加载令牌
    var token = tokenHandler.ReadToken(tokenString) as Saml2SecurityToken;

    // 验证签名
    if (!token.Signature.Verify()) { throw new InvalidOperationException("Invalid signature."); }

    // 验证颁发者和受众
    if (token.Issuer != "expectedIssuer" || token.Audience != "expectedAudience") { throw new InvalidOperationException("Invalid issuer or audience."); }

    // 提取声明
    var claims = token.Claims;

    // 创建 ClaimsPrincipal
    var principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Saml"));

    return principal;
}

优点和缺点

自定义配置节

  • 优点: 更简单、更符合 WIF 框架。
  • 缺点: 需要维护额外的配置信息。

手动验证

  • 优点: 更灵活、更具控制力。
  • 缺点: 更复杂、需要手动处理验证逻辑。

结论

在 C# 类库中验证 SAML 令牌需要额外的考虑。通过使用自定义配置节或手动验证方法,您可以集成 WIF 框架并验证 SAML 令牌,从而安全地访问受保护的资源。

常见问题解答

  1. 我需要使用哪个方法? 这取决于您的具体需求和偏好。自定义配置节更简单,而手动验证更灵活。
  2. 如何获得 SAML 令牌? 令牌通常由身份提供者(IdP)颁发。您需要与 IdP 集成以获取令牌。
  3. 如何保护令牌? 令牌应使用安全协议(例如 HTTPS)传输并存储在安全位置。
  4. 我如何知道令牌是否有效? 令牌应使用数字签名验证,并且颁发者和受众应与您期望的值匹配。
  5. 验证失败时该怎么办? 验证失败可能是由配置问题、签名验证失败或令牌无效引起的。检查日志并尝试解决潜在问题。