ASP .NET 中的角色身份验证以 HTTP400 响应结束

Posted

技术标签:

【中文标题】ASP .NET 中的角色身份验证以 HTTP400 响应结束【英文标题】:Roles auth in ASP .NET ends up with a HTTP400 response 【发布时间】:2021-11-29 14:49:19 【问题描述】:

我尝试在 ASP .NET Core 中进行简单的角色身份验证。制作方法如下:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginModel model)
    
        if (ModelState.IsValid)
        
            User user = await _db.Users.Include(u => u.Role).FirstOrDefaultAsync(u => u.Code == model.Code && u.Password == model.Password);
            if (user != null)
            
                await Authenticate(user);

                return RedirectToAction("Cabinet", "Cabinet");
            
            ModelState.AddModelError("", "Incorrect login or password");
        
        return View(model);
    
    private async Task Authenticate(User user)
    
        var claims = new List<Claim>
        
            new Claim(ClaimsIdentity.DefaultNameClaimType, user.Code),
            new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Name)
        ;

        ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id));
    

当我在CabinetController 中有这样的方法时,它工作得很好:

    [Authorize(Roles = "admin,user")]
    [HttpGet]
    public async Task<IActionResult> Cabinet()
    
        //some actions here
    

但是当我添加[ValidateAntiForgeryToken] 并且我的方法看起来像这样:

    [Authorize(Roles = "admin,user")]
    [ValidateAntiForgeryToken]
    [HttpGet]
    public async Task<IActionResult> Cabinet()
    
        //some actions here
    

身份验证成功后,我得到了 HTTP 400。我认为RedirectToAction("Cabinet", "Cabinet"); 会引发错误 400。我说的对吗?如果我是,为什么会这样?

【问题讨论】:

【参考方案1】:

错误很明显。

当您在方法上添加ValidateAntiForgeryToken 时,您需要将防伪令牌与请求一起发送。

【讨论】:

以上是关于ASP .NET 中的角色身份验证以 HTTP400 响应结束的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 身份中的角色声明与自定义身份验证中的角色权限相比

ASP.NET MVC 内联网应用程序。基于角色的身份验证链接到应用程序中的用户表

具有 Windows 身份验证的 ASP .NET 身份和数据库中的角色

通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证

控制器 ASP.net 核心 2.1 中的 Jwt 角色身份验证

使用 Active Directory 中的安全组的 Asp.Net 基于角色的身份验证