Asp.net Web API中基于身份的客户端证书和声明

Asp.net Web API中基于身份的客户端证书和声明,asp.net,asp.net-web-api,ssl-certificate,wif,claims-based-identity,Asp.net,Asp.net Web Api,Ssl Certificate,Wif,Claims Based Identity,如果通过HTTPS访问作为ASP.NET Web API控制器实现的端点的客户端提供客户端证书,则该证书可通过Request.GetClientCertificate获得。然而,我想知道:是否有可能以与.NET4.5中的安全模型集成的基于声明的模型的形式获得信息 我想这样做的主要原因是,我需要不同的客户机能够以不同的方式进行身份验证,以访问相同的服务,因此我更喜欢从证书等细节中抽象出来。我希望我的控制器能够根据当前用户的声明做出决策,而不必担心这些声明的出处 我知道有一个X509Certific

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

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

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

  • 通过TLS/SSL传递的客户端证书通过某种令牌映射过程(类似于可用于ACS的联邦提供程序生成的传入cookie如何由
    SessionSecurityTokenHandler处理)表示为
    X509CertificateClaimSet
  • 索赔转换模块(源自
    ClaimsAuthenticationManager
    并配置了
    元素)检查来自证书的索赔集,并将其转换为非令牌特定的应用程序特定索赔
  • 处理程序查找特定于应用程序的声明
  • 甚至还有一个
    X509SecurityTokenHandler
    ,听起来它应该这样做。但是,据我所知,它是为在发送的消息中处理基于证书的身份验证的场景而设计的-它似乎不支持证书所有权证明发生的场景在传输级别,即作为TLS/SSL握手的一部分,进行加密

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

    它看起来像会话身份验证模块(SAM)是当前提供声明主体的标识模型组件,它只是替换了以前在上下文中的组件以及当前线程的用户。但它似乎提供了可扩展性—如果覆盖其
    ValidateSessionToken
    ,则返回构成声明主体的
    ClaimsIdentity
    对象集所以在理论上,我可以推翻这一点,并在这一点上添加任何额外的索赔


    但我不确定该怎么做。据我所知,SAM是在
    ClaimsAuthenticationManager
    完成其声明转换后才这样做的。或者声明转换是错误的模式吗?

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

    这样,在您的应用程序中,您并不真正考虑证书,您只需要联邦身份提供者提供一些具体的声明


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

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

    只是为了澄清一下“身份模型”在本文中,您指的是Thinktecture身份模型库,而不是System.IdentityModel?(…这可能意味着Microsoft的身份框架不支持这一点?)是的。MS支持它,但Web API不使用它(因为它设计用于4.0和4.5)。我只是在我的库中提供了胶水。@leastprivilege或Ian/Ruben-你们中有人知道ASP.NET Identity 2.0是否集成了对基于客户端证书的身份验证的支持吗?如果没有,我可以集成
    Thinktecture.IdentityModel
    并将其仅用于基于客户端证书的身份验证,然后继续使用ASP.NET Identity默认身份验证+存储简单身份验证/外部身份验证?尽管我使用ASP.NET MVC 5和Identity 2.0,但我很想知道Ian是否能够获得一个有效的解决方案。这听起来要复杂得多。这意味着我需要编写或找到一个合适的外部ID提供程序,这也会迫使我的客户理解federated authen身份验证,因此它会使两端的实现复杂化。我还需要维护一个额外的服务。当您真正想要联合时,将映射推到其他位置是有意义的,但在这种情况下,我并不特别需要这样做,因此似乎没有回报。(我仍然需要实现证书处理和映射,它只是移动到另一台服务器。)