【问题标题】:Client Certificates and Claims-Based Identity in Web APIWeb API 中的客户端证书和基于声明的身份
【发布时间】:2013-01-31 17:59:33
【问题描述】:

如果通过 HTTPS 访问作为 ASP.NET Web API 控制器实现的端点的客户端提供了客户端证书,则该证书可通过 Request.GetClientCertificate 获得。但是,我想知道:是否有可能以与 .NET 4.5 中的安全模型集成的基于声明的模型的形式提供信息?

我想这样做的主要原因是我需要不同的客户端能够以不同的方式进行身份验证来访问相同的服务,所以我更愿意从证书等细节中抽象出来。我希望我的控制者能够根据当前用户的声明做出决定,而不用担心这些声明的出处。

我知道有一个 X509CertificateClaimSet 类型,这使得它看起来像自然流动:

  1. 通过 TLS/SSL 传递的客户端证书通过某种令牌映射过程表示为 X509CertificateClaimSet(类似于您可以用于 ACS 的联合提供程序生成的传入 cookie 由 SessionSecurityTokenHandler 处理的方式李>
  2. 声明转换模块(派生自 ClaimsAuthenticationManager 并配置有 <claimsAuthenticationManager> 元素)检查来自证书的声明集,并将其转换为非令牌特定的应用程序特定声明
  3. 处理程序查找特定于应用程序的声明。

甚至还有X509SecurityTokenHandler,听起来应该这样做。但是,据我所知,这是为在发送的消息中处理基于证书的身份验证的场景而设计的——它似乎不支持证书所有权证明发生在传输级别,即作为 TLS/SSL 握手的一部分。

我想知道是否需要编写自己的模块来执行此操作。从理论上讲,它看起来可能只是处理AuthenticateRequest 事件,查看证书请求,从证书构造一个X509CertificateClaimSet(如果存在)。但是……然后呢?我是否只是创建自己的ClaimsPrincipal 并替换现有用户?还是有一些“正确”的方法可以将我发现的声明添加到集合中? (客户端证书不一定是声明的唯一来源 - 我的应用程序已经在使用来自与 ACS 集成的声明。是否有标准机制来确保正确合并所有可能的声明来源?)

看起来SessionAuthenticationModule (SAM) 是当前提供声明主体的身份模型组件,它只是替换了先前在上下文中的那个以及当前线程的用户。但它似乎提供了可扩展性——如果你覆盖它的ValidateSessionToken,它将返回构成主体的ClaimsIdentity 对象集。所以理论上,我可以覆盖它并在那时添加任何额外的声明。

但我不确定这是要走的路。据我所知,SAM 是在 ClaimsAuthenticationManager 完成声明转换之后执行此操作的。还是索赔转换是错误的模型?

【问题讨论】:

    标签: asp.net asp.net-web-api ssl-certificate wif claims-based-identity


    【解决方案1】:

    看看here:客户端证书身份验证和声明生成是Thinktecture.IndetityModel 的一部分。

    【讨论】:

    • 澄清一下,这里所说的“身份模型”是指 Thinktecture 身份模型库,而不是 System.IdentityModel? (...这大概意味着微软的身份框架不支持开箱即用?)
    • 是的。它受 MS 支持,但 Web API 不使用它(因为它设计用于 4.0 和 4.5)。我刚刚在我的图书馆里提供了胶水。
    • @leastprivilege 或 Ian/Ruben - 你们中有人知道 ASP.NET Identity 2.0 是否集成了对基于客户端证书的身份验证的支持吗?如果不能,我可以集成Thinktecture.IdentityModel 并将其仅用于基于客户端证书的身份验证,并继续使用 asp.net 身份默认身份验证 + 存储进行简单身份验证/外部身份验证吗?尽管我使用的是 ASP.NET MVC 5 和 Identity 2.0,但我很想知道 Ian 是否能够得到一个可行的解决方案。
    【解决方案2】:

    如果我是你,我会将身份验证外部化 - 让其他一些服务提供身份验证并返回带有所需声明的 SAML 令牌。

    这样,在您的应用程序中,您并不会真正考虑证书,您只是期望来自联合身份提供者的一些具体声明。

    然后,您实施您的身份提供者之一以实际接受证书,但传出 SAML 隐藏此实施细节并将证书转换为对您的应用程序有用的声明集。

    【讨论】:

    • 这听起来要复杂得多。这意味着我需要编写或找到合适的外部 ID 提供程序,而且它还会迫使我的客户了解联合身份验证,因此它会使两端的实现变得复杂。而且我还要维护一项额外的服务。当您真正想要联合时,将映射推送到其他地方是有意义的,但在这种情况下,我没有特别需要,所以似乎没有回报。 (我仍然需要实现证书处理和映射,它只是移动到了不同的服务器。)
    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多