如何使用 Identity 但不使用 Azure 将身份验证添加到 ASP.NET Core 最小 API?

Avr*_*oel 5 c# authentication asp.net-identity asp.net-core minimal-apis

我确信这个问题的答案一定是显而易见的,因为这是一件显而易见的事情,但我似乎找不到任何指导。

我有一个 ASP.NET Core 最小 API,并且想要添加身份验证。我已经在不同的项目中设置了 Identity,并且希望对 API 使用相同的数据库(即相同的用户)。

我看到这篇博客文章,它看起来很有希望,直到我意识到那里的代码以纯文本形式检查用户名和密码(admin在示例中都使用)...

if (credentials[0] == "admin" && credentials[1] == "admin")
Run Code Online (Sandbox Code Playgroud)

问题在于(值得庆幸的是),身份不会以纯文本形式存储密码,它们是经过哈希处理的,所以我无法进行简单的比较。

我尝试对传入的密码进行哈希处理,如本答案所示,但这不起作用,因为每次调用时哈希值都不同_userManager.PasswordHasher.HashPassword

我尝试使用 ASP.NET Core 的SignInManager.CanSignInAsync方法来检查是否可以使用凭据登录,但这需要我将以下内容添加到Program...

builder.Services.AddIdentity<User, IdentityRole>(options => {
    // options removed for clarity
  })
  .AddDefaultTokenProviders()
  .AddEntityFrameworkStores<AppDbContext>();
Run Code Online (Sandbox Code Playgroud)

然而,一旦我这样做了,对 API 的任何请求都会尝试重定向到登录页面,这显然在从代码调用 API 时不起作用。

我在 Microsoft 网站上只能找到这篇文章,但这假设您使用的是 Azure。目前,我仍在本地计算机上开发它,我还不知道项目所有者是否想要部署到 Azure 还是他们自己的托管服务器,因此那里的代码对我没有帮助。

任何人都能够向我解释我如何完成看似如此明显且简单的任务?如果我需要提供更多信息,请告诉我。谢谢

Dre*_*eep 4

您看过 Bipin Joshi 关于这个主题的系列文章吗?我的猜测是您已经过了前几个,但您可能会发现这些很有用......

在 ASP.NET Core Minimal API 中实现 JWT 身份验证

将 ASP.NET Core Identity 与 JWT 和最小 API 集成

使用该方法时我所做的一个更改是getTokenAPI 调用仅采用用户名和密码两个string参数,而不是User对象。鉴于它只有两个参数,我发现这使得处理不同项目时的工作变得更容易,因为您不需要类定义。不过取决于你。

为了调用 API,您需要getToken先调用,并传入用户名和密码。获得令牌后,您可以按HtpClient如下方式设置身份验证...

client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
Run Code Online (Sandbox Code Playgroud)