Asp.net web api 在同一webapp中对ASP.NET Core 2 MVC和WebAPI进行身份验证
今天,我有一个ASP.NET Core 2 web应用程序,它包含标准的基于cookie的身份验证,可用于带有razor视图的MVC前端,还有一个带有JWT的WebAPI,可通过其他前端使用 通过这种方式,同一用户可以通过MVC razor网页和WebAPI调用登录,并访问每个页面的受保护操作。这两个部分工作正常,但相互独立 我现在想做的是扩展我的MVC前端的一部分,以使用VueJS并在幕后调用我的WebAPI 当用户通过MVC webapp登录时,ASP.NET Core 2中间件将创建cookie并向用户返回。但是,当我想通过VueJS向我的WebAPI发出请求时,我还需要一个JWT来传入标头 我正在努力解决的问题是,当用户除了cookie之外还通过MVC网页登录时,如何获得JWT。在MVC登录操作中,我当然可以生成JWT,但是如何将其返回给用户并存储在localStorage中呢 以下是我在MVC控制器中的当前登录操作(非常类似于模板):Asp.net web api 在同一webapp中对ASP.NET Core 2 MVC和WebAPI进行身份验证,asp.net-web-api,asp.net-core,asp.net-core-2.0,Asp.net Web Api,Asp.net Core,Asp.net Core 2.0,今天,我有一个ASP.NET Core 2 web应用程序,它包含标准的基于cookie的身份验证,可用于带有razor视图的MVC前端,还有一个带有JWT的WebAPI,可通过其他前端使用 通过这种方式,同一用户可以通过MVC razor网页和WebAPI调用登录,并访问每个页面的受保护操作。这两个部分工作正常,但相互独立 我现在想做的是扩展我的MVC前端的一部分,以使用VueJS并在幕后调用我的WebAPI 当用户通过MVC webapp登录时,ASP.NET Core 2中间件将创建coo
public异步任务登录(LoginViewModel模型,字符串returnUrl=null)
{
ViewData[“ReturnUrl”]=ReturnUrl;
if(ModelState.IsValid)
{
//这不会将登录失败计入帐户锁定
//要启用密码故障触发帐户锁定,请设置lockoutOnFailure:true
var result=wait _signInManager.PasswordSignInAsync(model.Email、model.Password、model.RememberMe、lockoutOnFailure:false);
if(result.successed)
{
_logger.LogInformation(“用户登录”);
var userToVerify=wait_userManager.findbyemailsync(model.Email);
var identity=wait Task.FromResult(_jwtFactory.GenerateClaimsIdentity(model.Email,userToVerify.Id));
//此时,“jwt”包含我需要存储在localStorage中的完整令牌对象
var jwt=wait Tokens.GenerateJwt(标识,_jwtFactory,model.Email,_jwtOptions,新JsonSerializerSettings{Formatting=Formatting.Indented});
返回重定向到本地(returnUrl);
}
其他的
{
AddModelError(string.Empty,“登录尝试无效”);
返回视图(模型);
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
您的代码在哪里?添加了当前登录MVC操作您可以将JWT附加到返回URL,然后让该页面运行一些脚本将其放入本地存储。我感谢您的回复。我最终选择了另一个方向,在VueJS中包含了web应用程序的登录部分。从那里我检索令牌并将其存储在本地存储器中。我正在慢慢地将其他经过身份验证的MVC路径转换为只使用Web API。
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
var userToVerify = await _userManager.FindByEmailAsync(model.Email);
var identity = await Task.FromResult(_jwtFactory.GenerateClaimsIdentity(model.Email, userToVerify.Id));
// At this point 'jwt' contains the complete token object I would need to store in localStorage
var jwt = await Tokens.GenerateJwt(identity, _jwtFactory, model.Email, _jwtOptions, new JsonSerializerSettings { Formatting = Formatting.Indented });
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}