注意:这是我第一次使用 .NET 身份,我凭感觉行事。
我正在构建一个具有 .NET 标识的项目。我在项目的早期定义了我的端点,我有身份工作,返回不记名令牌,并使用 Swagger 成功验证和访问安全端点。
在某个时刻,
/login
端点停止返回令牌,而只返回OK
状态。所以我开始调试。当我单步执行 /login
中的 Microsoft.AspNetCore.Routing.IdentityApiEndpointRouteBuilderExtensions.MapIdentityApi<>()
端点时,我注意到 /login 实际上并未返回任何数据。只有一条评论写着:The signInManager already produced the needed response in the form of a cookie or bearer token.
这对我来说毫无意义,但显然,它有效,因为我在某个时候有这个工作。我认为我的配置中有一些东西扰乱了 signInManager
返回数据的能力,但是,它确实做到了。
我尝试过单步执行
signInManager
,因为它尝试登录用户,但有数千行代码和代码可能采用的许多分支。我不知道从哪里开始。我查看了我的配置设置,但我真的不知道这些东西的一半是做什么的。我已经将我的设置与其他人所做的进行了比较,但每个人的做法似乎都不同,所以我无法分辨什么是标准的,什么是这家伙奇怪的设计选择,什么是不相关的。
这是我的构建器方法的副本,以便您可以查看我的配置https://pastebin.com/2z3Y5Vbj
怎么了?为什么
/login
不返回令牌?
我认为问题出在方案名称上。将“asp.net core 身份”与端点一起使用时。登录时有两种工作模式。
模式 1 正在为方案
CookieAuthenticationDefaults.AuthenticationScheme
生成 cookie(也称为“cookie”)。IdentityConstants.BearerScheme
的熊代币(也称为“Identity.Bearer”)。
正如你所说,使用 ASP.NET Core Identity 的方法有很多,但也存在一些差异。
AddIdentityCore<IdentityUser>()
:您必须手动AddCookie()
和AddBearer(IdentityConstants.BearerScheme)
AddIdentity<IdentityUser,IdentityRole>()
:包含AddCookie()
AddDefaultIdentity<IdentityUser>()
:包含AddCookie()
AddIdentityApiEndpoints
:包含 AddCookie()
和 AddBearer(IdentityConstants.BearerScheme)
所以在检查你的代码后,你用 jwt 方案名称搞乱了 cookie 方案,这不应该正常工作。