使用 Azure AD 和本地帐户保护 API

Posted

技术标签:

【中文标题】使用 Azure AD 和本地帐户保护 API【英文标题】:Securing API with Azure AD and local accounts 【发布时间】:2020-08-19 07:34:04 【问题描述】:

我想保护我的 API,以便只有在 Azure AD 中进行身份验证并在我的应用程序中拥有本地帐户的用户才能调用它。前面将是 React SPA 应用程序。我已经创建了使用 Azure AD 对用户进行身份验证的 PoC,并且我可以从 SPA 调用我的 API。

现在我想添加对本地帐户的支持。我想过使用 ASP.NET Core Identity 来管理本地用户。然后我会为 SPA 创建端点以获取 JWT 令牌。但我不确定这是否是要走的路。我看到了代码生成令牌的示例,实现起来似乎并不难,但这就是安全性。也许自己做不是一个好主意?

我看到人们正在使用 IdentityServer4,据我所知,它还可以使用我的本地 ASP.NET Core Identity 帐户并与 Azure Ad 集成。但这将是我需要学习的技术堆栈中的另一个工具。它不会与任何其他应用程序共享,它将是我需要部署和管理的另一项服务。也许这对这种情况来说有点矫枉过正?

我还有什么其他选择?

【问题讨论】:

【参考方案1】:

现在我想添加对本地帐户的支持。我想过使用 ASP.NET Core Identity 来管理本地用户。然后我会为 SPA 创建端点以获取 JWT 令牌。

您可以通过在 api 中为 token authentication 添加端点来做到这一点。您的客户端应用程序将用户的凭据传递给 web api,web api 验证来自本地数据库的凭据,并将 JWT 令牌创建回客户端应用程序。对于验证令牌,您的 Web api 将创建两种身份验证方案,一种用于 AAD 令牌,一种用于本地数据库用户的令牌。

我看到人们正在使用 IdentityServer4,据我所知,它还可以使用我的本地 ASP.NET Core Identity 帐户并与 Azure Ad 集成。

Identity Server 4 支持 Azure Active Directory 等外部身份提供程序,并且可以使用 ASP.NET Core Identity 作为用户管理。如果您了解 OpenID Connect ,实施起来并不难,您可以从 Single Sign-on / Sign-out 等功能中受益。 Here 是结合了 EF 和 ASP.NET Identity 的代码示例。您可以添加外部身份提供者,例如 AAD:

services.AddAuthentication()
.AddOpenIdConnect("aad", "Azure AD", options =>

    options.ClientId = "<appID>";
    options.Authority = "https://login.microsoftonline.com/<tenant>/";             
    options.CallbackPath = "/signin-oidc-aadtenant";            
    options.SaveTokens = true;                                 
    options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

)

【讨论】:

但我的问题是我是否应该自己为本地帐户发行 JWT 令牌?那我不是要自己实现OIDC和OpenAuth吗?这有意义吗?经过更多阅读,我不再认为这是我应该做的事情。 在 web api 中使用 JWT 很好,所以当使用本地帐户时,将 jwt 令牌发回给客户端。 After more reading I no longer think this is something I should do 为什么? 我的意思是自己创建它。我认为您应该坚持现有的解决方案,这些解决方案是根据标准构建的,众所周知并经过测试。无论如何,我正在切换到 Azure B2C。 Identity server4 文档很好,有很多代码示例,如果您接受 Azure AD B2C,请使用它。

以上是关于使用 Azure AD 和本地帐户保护 API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Azure AD B2C保护Spring Boot REST API?

无法验证从 Azure AD 获得的访问令牌签名以保护 Web API

使用 JWT 令牌保护 asp.net 核心 Web api 时如何从 Azure AD 获取用户

从 React 调用受 Azure AD 保护的 API

保护 Azure 存储帐户中托管的静态网站的路由

壹刊Azure AD调用受Microsoft 标识平台保护的 ASP.NET Core Web API (上)