在.Ner core中,如果有需要身份才能访问的地方,加上特性Authorize即可。
接下来,开始开发使用.Net core过滤器:
一、在Startup类中:
1.配置身份认证的key和身份认证不通过时要跳转的页面(一般是登录页):
2.在系统配置中,开启身份认证
此时再访问需要权限的页面,就会自动跳转到配置的登录页去
模拟登录操作,创建身份信息,存储起来
public IActionResult DoLogin()
{
//要在startup中开启身份认证
//模拟登录操作,登录成功后将用户信息存储在cookie中,下次可以直接使用
var user = new UserInfo()
{
UserId = 1000,
UserName = "Ling、bug",
Age = 23,
Sex = "男",
Birthday = DateTime.Now.AddYears(-24),
LoginDate = DateTime.Now
};
//1.初始化身份并指定身份认证的类型
string type = "Forms";
var identity = new ClaimsIdentity(type);
//2.添加身份信息
foreach (var proc in user.GetType().GetProperties())
{
var key = proc.Name;
var value = proc.GetValue(user);
identity.AddClaim(new Claim(key, value.ToString()));
}
//3.生成身份票据
var ticket = new ClaimsPrincipal(identity);
//4.将身份票据保存在请求上下文
//注意:这里保存时会指定一个key去保存(后期也是通过这个key来取身份和验证身份),
//这个身份要与startup文件中配置的key相同:services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, ticket);
return Content("登录操作");
}
此时做了登录之后再去访问需要身份的页面,就可以访问了
但是,如果在需要用到当前身份信息的时候(比如获取当前登录用户的姓名等等),该如何获取当前用户的身份信息呢?
[Authorize]
public IActionResult Index()
{
//有了身份认证,在需要当前用户信息时,读取当前用户信息
var currentUserDataList = new List<string>();
foreach (var proc in typeof(UserInfo).GetProperties())
{
var key = proc.Name;
var value = HttpContext.User.FindFirstValue(key);
currentUserDataList.Add(string.Format(@"{0} = {1}", key, value));
}
return Content(string.Join(",", currentUserDataList));
}
退出登录操作:
/// <summary>
/// 退出登录
/// </summary>
/// <returns></returns>
public IActionResult DoLoginOut()
{
string key = CookieAuthenticationDefaults.AuthenticationScheme;
HttpContext.SignOutAsync(key);
return Content("退出成功,cookie key = " + key);
}