使用SignInManager而不调用app.UseIdentity()

本文关键字:UseIdentity app 调用 SignInManager 使用 | 更新日期: 2023-09-27 18:04:30

我需要使用基本的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() ?

使用SignInManager而不调用app.UseIdentity()

它确实做了一些不同的事情,它使用IdentityOptions来设置cookie中间件,当对用户进行身份验证时,signInManager中的其他地方也使用了相同的IdentityOptions。

它特别使用了"Identity "。应用程序"作为应用程序cookie的认证方案的名称,因为它在尝试对用户进行身份验证时也使用该名称,因此它会抛出错误,因为没有与认证方案匹配的cookie中间件,因为您的命名不同。

如果您将您的AuthenticationScheme和CookieName命名为"Identity"。应用程序",那么它应该会越过这个错误。

或者您可以配置IdentityOptions以匹配您选择的authenticationscheme和cookiename,以便在signinManager尝试验证用户

时将匹配的值从signinManager传入。