无论是否对用户进行身份验证的客户端的OAuth身份验证

时间:2017-10-03 20:35:47

标签: c# .net authentication oauth-2.0

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

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

然而,有几种情况我不知道如何处理。例如:

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

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

1 个答案:

答案 0 :(得分:0)

如果您有最终用户,则可以使用资源所有者密码授予的组合 - 如果不是,则可以使用客户端凭据授予。

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

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

例如,根据您使用的授权,您的API网关可以向后端添加不同的标头,然后您可以检查该标头以查看正在进行的呼叫类型。对于例如Mashape Kong,您将获得X-ConsumerId,无论是CC和RO授权,还是RO授权,您还将获得X-Authenticated-UserId(和X-Authenticated-Scope,如果您工作有范围)。

如果您正在滚动自己的OAuth2实现(哼?),您只需要内省用于创建令牌(passwordclient_credentials)的授权类型的令牌以了解什么作为机器用户或代表最终用户的访问类型,您提供给应用程序。

希望可以提供帮助。