Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api 在同一webapp中对ASP.NET Core 2 MVC和WebAPI进行身份验证_Asp.net Web Api_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

Asp.net web api 在同一webapp中对ASP.NET Core 2 MVC和WebAPI进行身份验证

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

今天,我有一个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控制器中的当前登录操作(非常类似于模板):

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);
    }