Security 消费者使用声明身份验证时如何保护API 背景

Security 消费者使用声明身份验证时如何保护API 背景,security,authentication,oauth,adfs,api-design,Security,Authentication,Oauth,Adfs,Api Design,我正在构建一个.NETMVC企业web应用程序,它必须能够对来自不同公司的用户进行身份验证。其中一个主要要求是确保用户不需要创建和记住新的凭据来使用应用程序,而应该继续使用他们用来访问公司内部网中的应用程序的任何凭据 由于应用程序将托管在外联网上,并且需要处理针对多个域(即多个活动目录)的身份验证,因此我们希望每个客户端设置一个安全令牌服务(AD FS),应用程序可以与之交互以实现声明身份验证 MVC应用程序将检查用户是否已通过身份验证,如果未通过身份验证,则启动工作流,以MVC应用程序获得与用

我正在构建一个.NETMVC企业web应用程序,它必须能够对来自不同公司的用户进行身份验证。其中一个主要要求是确保用户不需要创建和记住新的凭据来使用应用程序,而应该继续使用他们用来访问公司内部网中的应用程序的任何凭据

由于应用程序将托管在外联网上,并且需要处理针对多个域(即多个活动目录)的身份验证,因此我们希望每个客户端设置一个安全令牌服务(AD FS),应用程序可以与之交互以实现声明身份验证

MVC应用程序将检查用户是否已通过身份验证,如果未通过身份验证,则启动工作流,以MVC应用程序获得与用户关联的SAML声明结束

问题 此时,用户经过身份验证,并被授予访问MVC应用程序的权限。然而,应用程序本身是一个现代web应用程序,它使用大量JavaScript来使用处理大部分业务逻辑的.NETWebAPI我的主要问题是如何保护此API。我希望确保发送到此服务器的唯一请求是从有效源发送的,并且使用该服务的用户具有这样做的权限

当前解决方案 我可以采用两种方法来使用API:

  • 直接来自JavaScript(首选解决方案)
  • 通过MVC服务器路由请求,然后MVC服务器将其转发到API
  • 为了选择一种方法,我首先需要找到一种保护API的方法

    HMAC认证 我发现的最直接的解决方案是HMAC身份验证-。但是,这种方法要求所有API请求直接来自MVC服务器,因为密钥需要位于MVC服务器上

    OAuth2.0 我可以实现的第二种方法是OAuth2.0的一些风格。我熟悉的口味可以在这里找到:

    • 授权码
    • 含蓄的
    • 资源所有者凭据
    • 客户端凭据
    授权码授予 这不是我想采取的方法。MVC应用程序已经收到了用户的声明——他们不应该因为API需要声明而再次这样做。(我有一个后续问题,问我是否可以简单地将声明传递给API服务器)

    隐性补助 我喜欢这种方法听起来的方式,因为我将能够在客户机中执行API请求(即JavaScript代码),但是它遇到与第一种方法相同的问题

    资源所有者凭据授予 这种方法是不可能的——我不希望MVC应用程序或API保留用户的凭据

    客户端凭据授予 这种方法是列出的唯一合理的OAuth方法——但是我看不出这种方法与上面详述的HMAC身份验证之间的主要区别

    问题
  • 我是否正确设置了MVC应用程序的身份验证结构?具体来说,在这种情况下,让AD FS处理身份验证并使用代表用户声明的SAML令牌进行响应是否合适
  • 我计划在服务器会话中存储用户数据。我还可以将用户的声明存储在会话中,然后以某种方式将其发送到API进行身份验证吗
  • 如果我可以将声明从MVC服务器传递到API服务器,并且API服务器可以正确验证请求,那么将声明传递到客户端(浏览器/JS代码)是否安全,以便使用API可以绕过MVC服务器
  • HMAC身份验证方法是最好的方法吗
  • 是的,使用ADF或任何IdP产品作为应用程序的IdP是实现SSO的好方法。这样做可以帮助您将所有联邦访问管理以及声明规则委托给ADF
  • 是的,您可以在会话中存储声明,并以某种方式将它们发送到WebAPI。请注意,如果您正在使用WIF,它已经将声明作为ClaimsPrincipal对象存储在Thread.CurrentPrincipal中。另一件事是,我假设您只想以某种方式发送声明,而不是整个SAML2令牌
  • 我想说,它与您在客户端保护令牌所使用的机制一样安全。查看和以了解更多详细信息
  • 我不能说这是否对您最有利,但考虑到您也可以控制WebAPI,这似乎是一种可行的方法。然而,使用JWT令牌似乎更容易:。说到JWT代币,您还可以让ADFS为您发行: