ASP.NET Core 的身份验证中间件是否始终对 OpenID Connect 使用隐式流?

Does ASP.NET Core's authentication middleware always use implicit flow for OpenID Connect?

在 Visual Studio 2019 中设置一个简单的开箱即用的 ASP.NET Core MVC 应用程序并启用针对 Azure Active Directory 的身份验证将导致在使用 OpenID-Connect 时隐式 OAuth2 流.

这是插图here

我刚刚对此进行了测试,我不必处理授权代码流所必需的客户端机密,因此我认为以上内容是正确的。

另一方面,documentation 不鼓励使用隐式流:

The implicit grant presents more risks than other grants, [...] If you are developing a Web application that includes a backend, and consuming an API from its backend code, the implicit flow is also not a good fit.

为了进一步混淆事情,this documentation 指出 Web 应用程序正在使用授权代码流:

The OAuth 2.0 authorization code flow is described in section 4.1 of the OAuth 2.0 specification. It's used to perform authentication and authorization in the majority of app types, including web apps and natively installed apps.

出现的问题是

不幸的是,您的观察是正确的。

提供的示例使用隐式流。我想为简单起见。这从configuration script for the latest sample就可以看出。

所有关于隐式流的说法都是正确的。包括评论中的那个。

但是,我们要注意,使用OpenID Connect的ASP.NET核心项目的默认脚手架实际上只执行身份验证而不是授权。它也不执行对外部 API 的调用。从这个意义上讲,隐式流仅用于获得 id_token,而不是 access_token。前者包含用户个人资料信息,不会带来安全风险。而后者包含用于访问特定资源的授权数据。因此 id_token 本身在泄漏时不会带来安全风险。是的,如果泄漏,它会造成数据泄漏,但不是安全性的。

还有更完整的样本here。它使用 ob-behalf-of 流来获取 access_token 来调用外部服务。依然不是全授权码盛大流程,而是代发流程。后者更安全。

一般来说,.NET Core中的OpenIDConnect实现确实有处理授权码的实现,从AuthorizationCodeRecieved event. Which can be used when constructing OpenIdConnectOptions object by defining the OpenIDConnectEvents property中可以看出。

坦白说,问为什么项目脚手架设计成这样,不会引起太多关注,也不会改变什么。我很确定旧的实现(.net 4.5 左右)默认使用 AuthZ 代码。不确定为什么会发生变化 - 可能是为了减少实施和理解示例的摩擦....

但是,嘿,IMO 使用授权码 grand 来获取 ID 令牌有点过分了,不是吗?

处理评论

1) 同意这是一团糟。 Authorize 属性除了检查 authenticated 用户外什么都不做。它还可以配置为检查特定角色。但即便如此,那个角色也会从id_token中提取出来。因为对于网络应用程序,您没有 access_token。我的观点是,当你处理一个简单的网络应用程序(前端、后端 - 控制器或 ASPX 页面)时,你只处理 id_tokens 而没有访问令牌。在这种情况下,隐式流程显着降低了代码复杂性。

文档在 GitHub 上开源,任何负责任的程序员都可以自由(并且更受欢迎)提出改进建议或指出问题。虽然 Whosebug 用于技术问题和解答,而不是关于软件文档的投诉。