我已成功遵循本指南(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 });
}
答案 0 :(得分:0)
最后,我通过重定向到服务器端登录表单来修复此问题,以便客户端和服务器登录。
服务器端登录(“/ Account / Login”)表单验证客户端(jwt)和服务器(cookie)身份验证方案
客户端登录(“〜/ api / auth / login”)表单仅对客户端(jwt)进行了身份验证。