我需要使用基本的SignIn机制登录用户到我的网站:
var result = await _signInManager.PasswordSignInAsync(username, password, false, lockoutOnFailure: false);
抛出一个错误:
没有配置身份验证处理程序来处理方案:Identity。应用
原因可能是:我没有在Startup.cs
中调用app.UseIdentity();
。
我没有调用它,因为我想自己配置cookie。所以我用这个代替UseIdentity
:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = false,
TokenValidationParameters = tokenValidationParameters
});
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = false,
AuthenticationScheme = "Cookie",
CookieName = "access_token",
TicketDataFormat = new CustomJwtDataFormat(
SecurityAlgorithms.HmacSha256,
tokenValidationParameters)
});
如果我调用app.UseIdentity();
, PasswordSignInAsync
工作正常,但CookieAuthentication
的行为就像它在UseIdentity
中配置一样(它重定向到/Account/Login
,此行为在我的配置中被禁用)。
正如我在源代码中看到的,UseIdentity
并没有比我做的更多(它只是使用UseCookieAuthentication
,和我做的一样)。那么,为什么我的解决方案会产生问题呢?
我该怎么做才能使PasswordSignInAsync
工作而不使用app.UseIdentity()
?
它确实做了一些不同的事情,它使用IdentityOptions来设置cookie中间件,当对用户进行身份验证时,signInManager中的其他地方也使用了相同的IdentityOptions。
它特别使用了"Identity "。应用程序"作为应用程序cookie的认证方案的名称,因为它在尝试对用户进行身份验证时也使用该名称,因此它会抛出错误,因为没有与认证方案匹配的cookie中间件,因为您的命名不同。
如果您将您的AuthenticationScheme和CookieName命名为"Identity"。应用程序",那么它应该会越过这个错误。
或者您可以配置IdentityOptions以匹配您选择的authenticationscheme和cookiename,以便在signinManager尝试验证用户