我正在将一个简单的身份验证过程集成到asp.net core 2.1应用程序中,在该应用程序中,用户默认情况下是通过UI登录的,但是也可以获取令牌并调用一些安全的api端点检索报告所需的一些数据。
我面临的问题是,使用默认配置,一切正常,但是添加令牌配置会引发一些奇怪的错误。
如果我不添加AddCookie("Identity.External")
,则在/Identity/Account/Login
处调用onGet方法会引发异常
InvalidOperationException:没有为方案“ Identity.External”注册任何注销身份验证处理程序。注册的注销方案为:Identity.Application。您是否忘了调用AddAuthentication()。AddCookies(“ Identity.External”,...)?
如果我未指定options.DefaultScheme = "Identity.Application";
,则表示用户未成功登录。
如果我不添加.AddCookie("Identity.External")
和.AddCookie("Identity.TwoFactorUserId")
,则注销过程将引发与上述相同的异常。
对于登录过程,只需删除行await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
即可解决。如果我不使用外部方案,则不需要退出它们,对吧?
这给我带来了一个问题:如何在Identity Core中禁用外部登录和多因素身份验证,因此我不必首先添加这些cookie?此外,为什么我必须指定一个名为“ Identity.Application”的cookie,而在默认配置中却不是这种情况?我很确定这只是我没有完全理解手头问题的另一个问题,因此,我很感谢对此所做的任何澄清。
这是来自Startup.cs的我的Identity配置,我还用自定义的IdentityUser类搭建了完整的Identity UI。
var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));
services.Configure<JwtIssuerOptions>(options =>
{
options.Issuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
options.Audience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)];
options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256);
});
var tokenValidationParameters = new TokenValidationParameters
{
/*...*/
};
services.AddAuthentication(options =>
{
options.DefaultScheme = "Identity.Application";
})
//.AddCookie("Identity.External")
//.AddCookie("Identity.TwoFactorUserId")
.AddCookie("Identity.Application", opt =>
{
opt.SlidingExpiration = true;
})
.AddJwtBearer(options =>
{
options.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
options.TokenValidationParameters = tokenValidationParameters;
options.SaveToken = true;
});
var builder = services.AddIdentityCore<AppUser>(o =>
{
//removed
});
builder = new IdentityBuilder(builder.UserType, typeof(IdentityRole), builder.Services);
builder.AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();