如何在不使用 Azure 的情况下使用 Identity 向 ASP.NET Core minimal API 添加身份验证?

How do I add authentication to an ASP.NET Core minimal API using Identity, but without using Azure?

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

我有一个 ASP.NET Core minimal API,并且想要添加身份验证。我已经在不同的项目中设置了身份,并且想为 API.

使用相同的数据库(即相同的用户)

我看到了 this blog post,这看起来很有希望,直到我意识到那里的代码将用户名和密码检查为纯文本(示例中都使用 admin)...

if (credentials[0] == "admin" && credentials[1] == "admin")

这个问题是(谢天谢地)Identity 不以明文形式存储密码,它们是散列的,所以我不能做简单的比较。

我尝试对输入的密码进行散列处理,如 ,但这没有用,因为每次调用 _userManager.PasswordHasher.HashPassword.

时散列值都不一样

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

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

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

我在 Microsoft 的网站上只能找到 this article,但这是假设您使用的是 Azure。目前,我还在我的本地机器上开发这个,我还不知道项目所有者是想部署到 Azure 还是他们自己的托管服务器,所以那里的代码对我没有帮助。

任何人都可以向我解释我是如何完成如此明显和简单的任务的吗?如果我需要提供更多信息,请告诉我。谢谢

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

Implement JWT Authentication In ASP.NET Core Minimal APIs

Integrate ASP.NET Core Identity With JWT And Minimal APIs

我在使用该方法时所做的一个更改是 getToken API 调用只需要两个 string 用户名和密码参数,而不是 User 对象。鉴于它只有两个参数,我发现在处理不同的项目时这会让生活更轻松,因为您不需要 class 定义。不过由你决定。

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

client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);