Asp.Net MVC 6 Cookie身份验证 - 授权失败

时间:2016-02-17 16:10:03

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

我正在尝试使用Cookie Middleware身份验证创建asp.net核心mvc 6应用。 我的代码编译没有错误,但即使在成功登录后我也没有授权用户

这是我的startup.cs配置

        app.UseCookieAuthentication(options =>
        {
            options.AuthenticationScheme = "CookieAuth";
            options.LoginPath = new PathString("/Account/Login/");
            options.AccessDeniedPath = new PathString("/Account/Login/");
            options.AutomaticAuthenticate = true;
            options.AutomaticChallenge = true;

        });

还在我的控制器中登录操作:

   public async Task<IActionResult> Login(LoginViewModel model)
    {

        User foundUser = _userManager.findUser(model.UserName, model.Password);


        if (foundUser != null)
        {
            List<Claim> userClaims = new List<Claim>
            {
                new Claim("userId", Convert.ToString(foundUser.UserID)),
                new Claim(ClaimTypes.Name, foundUser.UserName),
                new Claim(ClaimTypes.Role, Convert.ToString(foundUser.RoleID))
            };

            ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims));
            await HttpContext.Authentication.SignInAsync("CookieAuth", principal);


            return RedirectToAction("Index", "Dashboard");
        }
        return View();
    }

最后是仪表板/索引动作

[Authorize]
public IActionResult Index()
{
    return View();
}

我在登录操作中放了一些断点,一切似乎都运行正常。 Cookie也正确设置。

现在我不知道如何在登录后转到信息中心/索引。 每次由于配置设置而被重定向到/ Account / Login /

我做错了什么?

1 个答案:

答案 0 :(得分:17)

在登录中构建ClaimsIdentity时,需要使用指定authenticationType的其他构造函数。

而不是

ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims));

你应该这样做:

ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims, "local"));
  

现在可以创建具有声明的ClaimsIdentity,但是   将IsAuthenticated设置为false。实际上这是现在的默认值......

     

要将IsAuthenticated设置为true,您需要指定身份验证类型

我从Dominick Baier的博客here获得了这些信息。

还有一个使用cookie中间件here的好例子,也是(传奇的)Dominick Baier / leastprivilege。

修改

This answer包含有关用于authenticationType字符串的更多信息。