ASP.NET Core中Claims表示用户的身份,比如用户名、角色等信息,它们被放置在一个用户的声明列表中。通过使用Claims,可以进行基于用户身份进行权限控制等操作。
下面是一个添加Claims的示例代码:
public async Task Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
{
var claims = new List
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Role, "User")
};
var userIdentity = new ClaimsIdentity(claims, "login");
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
await HttpContext.SignInAsync(principal);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "Invalid UserName or Password");
}
}
return View(model);
}
在上面的代码中,通过创建一个Claim对象数组并将其传递给ClaimsIdentity,然后将ClaimsIdentity加入到ClaimsPrincipal中。最后通过HttpContext.SignInAsync方法将用户的身份信息保存到Cookie中。
在使用Claims时,可以使用Authorize属性指定需要的角色或者Claim:
[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
// ...
}
上面的代码表示只有拥有Admin角色的用户才可以访问AdminController中的Action方法。
除了可以使用预定义的ClaimTypes之外,也可以使用自定义的ClaimType:
new Claim("http://myapp.com/claims/customerid", customerId.ToString())
这里的"http://myapp.com/claims/customerid"就是自定义的ClaimType。
通过Claims访问用户的身份信息:
var identity = User.Identity as ClaimsIdentity;
var customerId = int.Parse(identity?.FindFirst("http://myapp.com/claims/customerid")?.Value);
上面的代码中,通过User.Identity获取