【问题标题】:OAuth authentication for clients with and without authenticating users具有和不具有用户身份验证的客户端的 OAuth 身份验证
【发布时间】:2019-06-07 05:11:47
【问题描述】:

我有一个已成功创建的 .NET Core API,它具有 OAuth 功能。

我使用grant_type=password 以及usernamepassword 来接收访问令牌并使用请求Authorization 标头和AuthorizeAttributes 以​​及控制器上的Policy 参数调用我的控制器操作行动。一切都很好。

但是,有几种情况我不确定如何处理。例如:

有时我希望我的客户端应用程序(会有多个)在用户尚未通过身份验证时允许访问 API,但我不想让它向世界开放。也就是说,对于某些端点,不需要对特定用户进行身份验证,但我想限制访问。稍后,用户可能会选择登录,根据他们的授权授予他们对更多 API 的访问权限。

我应该如何处理?我应该在每个请求中传递client_idclient_secret 吗?如果是这样,我该如何在我的 AuthorizeAttributes 中处理这个?或者我应该使用client_idclient_secret 和一个空白的usernamepassword 进行一次身份验证......然后当/如果用户实际使用所有4 个参数登录时再次验证?

【问题讨论】:

    标签: c# .net authentication oauth-2.0


    【解决方案1】:

    您可以结合使用资源所有者密码授权(如果您有最终用户)和客户端凭据授权(如果没有)。

    根据您的 API 网关,这会有所不同,但归结为以下几点:

    • 客户端凭据授予只会确保后端知道哪个应用程序在进行调用,但没有最终用户上下文
    • 资源所有者密码授予将最终用户上下文添加到此,但在其他方面的行为类似于 CC 授予,因为您不需要 UI 来实现它(与授权代码授予和隐式授予相反)。

    例如,您的 API 网关可以根据您使用的授权向您的后端添加不同的标头,然后您可以检查哪些类型的调用正在访问它。例如Mashape Kong,您将始终获得X-ConsumerId,用于 CC 和 RO 授权,但使用 RO 授权,您还将额外收到 X-Authenticated-UserId(和 X-Authenticated-Scope,如果您使用范围)。

    如果您正在推出自己的 OAuth2 实现(咳咳?),您只需检查用于创建令牌的授权类型(passwordclient_credentials)的令牌,以了解哪种访问方式 -作为机器用户或代表最终用户 - 您提供给应用程序。

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 2012-01-03
      • 2016-10-22
      • 2013-06-17
      相关资源
      最近更新 更多