ASP Identity OAuth token - 我应该在移动应用程序流程中使用 ValidateClientAuthentication() 和 Secret 吗?

ASP Identity OAuth token - Should I use ValidateClientAuthentication() and Secret in mobile app flow?

我有一个移动应用程序,它与后端的 ASP WebAPI 通信。
我已经实现了令牌流身份验证(在 Taiseer's guide 的帮助下)。

还有一个概念我无法理解:CleintIdClientSecret

根据我的理解,客户端密码(以及客户端 ID)是为了 阻止访问我的 API 中生成令牌的端点。通过这种方式,可以保护端点免受试图在 API 周围戳戳的恶意用户的攻击,并尝试通过使用各种输入调用它来获取一些信息。

意思是,只有掌握秘密的客户端才能启动身份验证流程。在我的例子中,我只有一个客户端,它是一个移动应用程序,它的秘密存储在一个安全的地方(iOs 的 KeyChain)。但我读到这些钥匙链可以很容易地丢弃和剖析以寻找秘密。

所以我得出的结论是,我可以摆脱整个客户端秘密逻辑,主要是将 ValidateClientAuthentication() 留空:

public async override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{

    context.Validated();
    return;
}

在我看来,这不像是安全漏洞,而只是流中的一个薄层,现在已经消失了。因为,再一次,任何持有安装了该应用程序的移动设备的恶意用户都可以轻松泄露客户端机密,一旦他得到它,这一层安全措施就毫无用处。

这些假设不正确吗?

我可以将 ValidateClientAuthentication() 方法留空吗?

如您所知,移动应用程序无法将其凭据保密,因为它们可以从应用程序二进制文件中提取。更不用说使用代理服务器和流量分析器(如 Fiddler 或 Wireshark)可以轻松拦截请求。

使用授权代码流 (1) 或资源所有者密码凭据授予,如果客户端无法安全地存储其凭据,则客户端身份验证不是强制性的,因此不能被视为“机密”应用程序(请参阅 https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3 and https://www.rfc-editor.org/rfc/rfc6749#section-4.3.2).

对于非机密应用程序,调用 context.Validated().

是安全的

就我个人而言,我尽量避免授予资源所有者密码凭据,因为它显然违背了 OAuth2 的目的:对您的密码保密并提供受限授权。不过,如果您的应用是完全受信任的,那应该不是问题。


  1. 实际上,在不强制执行客户端身份验证的情况下使用授权代码流是极其罕见的,因为在移动客户端应用程序中使用隐式流更简单,在这种情况下提供类似的安全级别(更不用说它避免到令牌端点的第二次往返)。