asp.net双重身份验证必须登录两次

时间:2017-12-19 11:12:45

标签: c# asp.net reactjs asp.net-core-mvc

我已成功遵循本指南(https://docs.microsoft.com/en-us/aspnet/core/security/authorization/limitingidentitybyscheme?tabs=aspnetcore2x)以允许对我的react / redux前端进行身份验证(使用js fetch将jwt令牌传递给Web API),以及服务器呈现的& #34;后端" (普通的MVC)管理页面。

我可以登录" side"应用程序,但我被迫再次登录到另一边。应用程序服务器端部分的链接是简单的" a href"标签,因此无法传递jwt标头令牌。有没有办法让登录到一个身份验证方案(例如JwtBearerDefaults.AuthenticationScheme)反映您在其他方案中签署的事实(例如CookieAuthenticationDefaults.AuthenticationScheme)?

注意:类似于Asp.net React+Redux, tracking a user who has logged in?

这是我的AuthController登录方法:

    [AllowAnonymous]
    [HttpPost("~/api/auth/login")]
    [Produces("application/json")]
    public async Task<IActionResult> Login(string username, string password)
    {
        // Ensure the username and password is valid.
        var user = await _userManager.FindByNameAsync(username);
        if (user == null || !await _userManager.CheckPasswordAsync(user, password))
        {
            return BadRequest(new
            {
                error = "", //OpenIdConnectConstants.Errors.InvalidGrant,
                error_description = "The username or password is invalid."
            });
        }

        // Ensure the email is confirmed.
        if (!await _userManager.IsEmailConfirmedAsync(user))
        {
            return BadRequest(new
            {
                error = "email_not_confirmed",
                error_description = "You must have a confirmed email to log in."
            });
        }

        _logger.LogInformation($"User logged in (id: {user.Id})");

        var token = GetClientToken(user, _jwtOptions);

        // Do server-side login too (NB: This DOESNT WORK!)
        var result = await _signInManager.PasswordSignInAsync(username, password, true, false);
        if (!result.Succeeded)
        {
            _logger.LogWarning("Could not log in to server side");
        }

        return Ok(new { token });
    }

1 个答案:

答案 0 :(得分:0)

最后,我通过重定向到服务器端登录表单来修复此问题,以便客户端和服务器登录。

服务器端登录(“/ Account / Login”)表单验证客户端(jwt)和服务器(cookie)身份验证方案

客户端登录(“〜/ api / auth / login”)表单仅对客户端(jwt)进行了身份验证。