如何根据 Angular(或另一个 SPA)的 Asp.Net 核心身份进行身份验证?

How to authenticate against an Asp.Net Core Identity from an Angular(Or another SPA)?

我正在创建一个服务,它将 Asp.Net Core 作为后端,angular 作为前端。 我正在 Microsoft 为 SPA 提供的不同模板上测试几项内容。

所以我用 .Net core 5 cli 使用这个命令创建了一个:

dotnet new angular -au Individual

似乎可行,但我的理解是,当我需要将用户重定向到加载页面时(因为未连接或权限不足),我将被重定向到页面的 UI Asp.Net核心。

我看到我可以自定义这个页面(好吧,创建一个脚手架版本并自定义它),但它仍然让我担心:

所以我的问题是,如何针对使用 asp.net 核心身份的 Asp.Net 核心服务器进行身份验证?

在示例中,MS 将您推向 Identity 路线,并使用 Razor Class 库来控制 login/register 功能。它设置为使用 OpenId Connect (https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth) 并在每个阶段使用重定向。如果您想保持一切纯净 Angular 并公开 WebAPI 端点以进行身份​​验证,这很烦人,我认为 OpenID Connect 不会排除这一点。

.NET 文档不是很清楚如何调整解决方案以适应纯 SPA 解决方案,但您可以通过编写自己的 WebAPI 控制器来处理注册和登录等。

到目前为止我找到的最好的 MS 文档在这里:https://docs.microsoft.com/en-us/dotnet/architecture/microservices/secure-net-microservices-web-applications/

这个答案也很有用:

并查看:Login to Angular SPA with asp .net core 3 API without redirect outside of SPA

我最初使用的是 Razor login/registration 流程,但我已经搭建了页面脚手架,因此我可以自定义它们。这让我有时间继续 Angular 项目的重要部分,但我可以轻松地回来并稍后替换登录流程。脚手架页面包含身份验证流程,因此可以更轻松地查看正在发生的事情。

这里有关于如何将 Razor 页面搭建到项目中的文档: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity

如果您想要自己动手的解决方案,请查看 https://jasonwatmore.com/post/2019/10/14/aspnet-core-3-simple-api-for-authentication-registration-and-user-management

有关 JwtBearerAuthentication 的有用 YouTube 视频:https://youtu.be/h2hGGPHLqqc

这是一篇来自 Rick Stahl 的精彩文章:https://weblog.west-wind.com/posts/2021/Mar/09/Role-based-JWT-Tokens-in-ASPNET-Core

为清楚起见添加新答案。

我已经浏览了第一个答案中的所有链接,并整合了一个独立于我的 Angular 项目的 WebApi 项目。它使用身份存储 (EF) 但不使用 IdentityServer 并且不包含 UI(即仅 API)。它有一个帐户控制器,它支持注册和认证,并添加 Authorize 到 WeatherForecast GET 方法作为示例。

此处提供源代码:https://github.com/Brubning/Noodle.WebCore.Api

我已经在 README 中记录了构建项目所采取的步骤。您可以轻松地将其推送到使用 dotnet new angular 创建的 dotnet Angular 项目中(不包括 -au Individual)。