好的,这是我第一次尝试。Net Core 2.0和身份验证,尽管我过去用过Web API 2.0,在过去几年中,我在各种MVC和Webforms ASP项目上做了相当广泛的工作。
我正在尝试使用创建一个仅限Web API的项目。净核心。这将形成多租户应用程序的后端,用于生成一些报告,因此我需要能够对用户进行身份验证。通常的方法似乎是使用JWT-首先对用户进行身份验证以生成令牌,然后将其传递给客户端以在每个API请求中使用。将使用EF Core存储和检索数据。
我跟着
this post
为了实现这一设置的基本方法,我设法使其正常工作——我有一个控制器,它接受用户名/密码并在有效时返回令牌,以及一些基于声明的授权策略。
User
类别和
UserRole
源自标准的类别
IdentityUser
和
IdentityRole
课程,但我现在又回到了标准课程。
Startup.ConfigureServices
类别:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<MyContext>();
如果我没有这些行,那么最终会出现与UserManager、RoleManager、UserStore等相关的错误。所有这些都没有注册到DI。
我在网上看了很多东西,但从那以后很多事情都变了。Net Core 1。所以很多教程等都不再有效了。
编辑
好的,我现在发现在这段代码中,在
Startup.ConfigureServices()
方法:
services.AddAuthentication(
JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
>>breakpoint>>> options.TokenValidationParameters =
new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "Blah.Blah.Bearer",
ValidAudience = "Blah.Blah.Bearer",
IssuerSigningKey =
JwtSecurityKey.Create("verylongsecretkey")
};
});
如果我在指示的行上放置断点(通过“>breakpoint>”)然后当我
不要
从不
被击中。这是真的,无论我把方法放在哪里
services.AddIdentity()
呼叫我知道这只是一个lambda,所以它会在稍后执行,但是有什么方法可以让额外的东西不设置身份验证,或者让代码立即删除它?我假设在某个时刻,有一些代码选择不运行我在那里设置的Lambda for config,因为标识已经设置好了。。。
编辑-找到答案
https://github.com/aspnet/Identity/issues/1376
基本上我需要做两件事:
确保呼叫
services.AddIdentity<IdentityUser, IdentityContext()
已制作
将调用更改为从以下位置添加身份验证:
services.AddAuthentication(
JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
...
收件人:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
...
这确实会导致创建一个cookie,但据我所知,它并没有用于身份验证——它只是在向控制器/操作发出请求时使用承载令牌,而这些控制器/操作
[Authorize(Policy = "Administrator")]
或至少类似的集合。
我需要进行更多测试,如果我发现它在某种程度上不起作用,我会尝试回来更新。
(已编辑-立即输入适当的解决方案作为答案)