如何在Identity Core中禁用外部登录?

时间:2018-10-15 09:06:39

标签: c# asp.net-core asp.net-identity

我正在将一个简单的身份验证过程集成到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();

0 个答案:

没有答案