数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

asp.net core2.2多用户验证与授权示例详解

来源:脚本之家  责任编辑:小易  

前言

asp.net core2.2 用户验证 和授权有很详细和特贴心的介绍,我感兴趣的主要是这两篇:

我的项目有两类用户:

  • 微信公众号用户,用户名为公众号的openid
  • 企业微信的用户,用户名为企业微信的userid

每类用户中部分人员具有“Admin”角色

因为企业微信的用户有可能同时是微信公众号用户,即一个人两个名,所以需要多用户验证和授权。咱用代码说话最简洁,如下所示:

public class DemoController : Controller
{
 /// <summary>
 /// 企业微信用户使用的模块
 /// </summary>
 /// <returns></returns>
 public IActionResult Work()
 {
 return Content(User.Identity.Name +User.IsInRole("Admin"));
 }
 /// <summary>
 /// 企业微信管理员使用的模块
 /// </summary>
 /// <returns></returns>
 public IActionResult WorkAdmin()
 {
 return Content(User.Identity.Name + User.IsInRole("Admin"));
 }
 /// <summary>
 /// 微信公众号用户使用的模块
 /// </summary>
 /// <returns></returns>
 public IActionResult Mp()
 {
 return Content(User.Identity.Name + User.IsInRole("Admin"));
 }
 /// <summary>
 /// 微信公众号管理员使用的模块
 /// </summary>
 /// <returns></returns>
 public IActionResult MpAdmin()
 {
 return Content(User.Identity.Name + User.IsInRole("Admin"));
 }
}

下面咱一步一步实现。

第一步 改造类Startup

修改ConfigureServices方法,加入以下代码

  services.AddAuthentication
   (
   "Work" //就是设置一个缺省的cookie验证的名字,缺省的意思就是需要写的时候可以不写。另外很多时候用CookieAuthenticationDefaults.AuthenticationScheme,这玩意就是字符串常量“Cookies”,
   )
   .AddCookie
   (
   "Work", //cookie验证的名字,“Work”可以省略,因为是缺省名
   option =>
   {
    option.LoginPath = new PathString("/Demo/WorkLogin"); //设置验证的路径
    option.AccessDeniedPath= new PathString("/Demo/WorkDenied");//设置无授权访问跳转的路径
   }).AddCookie("Mp", option =>
   {
    option.LoginPath = new PathString("/Demo/MpLogin");
    option.AccessDeniedPath = new PathString("/Demo/MpDenied");
   });

修改Configure方法,加入以下代码

app.UseAuthentication();

第二步 添加验证

 public async Task WorkLogin(string returnUrl)
 {
  var claims = new List<Claim>
  {
   new Claim(ClaimTypes.Name, "UserId"),
   new Claim(ClaimTypes.Role, "Admin") //如果是管理员
  };

  var claimsIdentity = new ClaimsIdentity(claims, "Work");//“,"Work"”可以省略,因为是缺省名

  var authProperties = new AuthenticationProperties
  {
   AllowRefresh = true,
   //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10), 
   // The time at which the authentication ticket expires. A 
   // value set here overrides the ExpireTimeSpan option of 
   // CookieAuthenticationOptions set with AddCookie.
   IsPersistent = false, //持久化保存,到底什么意思我也不太清楚,哪位兄弟清楚的话,盼解释
   //IssuedUtc = <DateTimeOffset>,
   // The time at which the authentication ticket was issued.
   RedirectUri = returnUrl ?? "/Demo/Work"
  };

  await HttpContext.SignInAsync("Work", new ClaimsPrincipal(claimsIdentity), authProperties);
 }
 public IActionResult WorkDenied()
 {
  return Forbid();
 }


 public async Task MpLogin(string returnUrl)
 {
  var claims = new List<Claim>
  {
   new Claim(ClaimTypes.Name, "OpenId"),
   new Claim(ClaimTypes.Role, "Admin") //如果是管理员
  };

  var claimsIdentity = new ClaimsIdentity(claims, "Mp");//“,"Mp"”不能省略,因为不是缺省名

  var authProperties = new AuthenticationProperties
  {
   AllowRefresh = true,
   IsPersistent = false,
   RedirectUri = returnUrl ?? "/Demo/Mp"
  };

  await HttpContext.SignInAsync("Mp", new ClaimsPrincipal(claimsIdentity), authProperties);
 }
 public IActionResult MpDenied()
 {
  return Forbid();
 }

第三步 添加授权

就是在对应的Action前面加[Authorize]

 /// <summary>
 /// 企业微信用户使用的模块
 /// </summary>
 /// <returns></returns>
 [Authorize(
  AuthenticationSchemes ="Work" //缺省名可以省略
  )]
 public IActionResult Work()
 {
  return Content(User.Identity.Name + User.IsInRole("Admin"));
 }
 /// <summary>
 /// 企业微信管理员使用的模块
 /// </summary>
 /// <returns></returns>
 [Authorize(AuthenticationSchemes ="Work",Roles ="Admin")]
 public IActionResult WorkAdmin()
 {
  return Content(User.Identity.Name + User.IsInRole("Admin"));
 }
 /// <summary>
 /// 微信公众号用户使用的模块
 /// </summary>
 /// <returns></returns>
 [Authorize(AuthenticationSchemes ="Mp")]
 public IActionResult Mp()
 {
  return Content(User.Identity.Name + User.IsInRole("Admin"));
 }
 /// <summary>
 /// 微信公众号管理员使用的模块
 /// </summary>
 /// <returns></returns>
 [Authorize(AuthenticationSchemes ="Mp",Roles ="Admin")]
 public IActionResult MpAdmin()
 {
  return Content(User.Identity.Name + User.IsInRole("Admin"));
 }

Ctrl+F5运行,截屏如下:


最后,讲讲碰到的坑和求助


一开始的验证的代码如下:

 public async Task<IActionResult> Login(string returnUrl)
 {
  var claims = new List<Claim>
  {
   new Claim(ClaimTypes.Name, "UserId"),
   new Claim(ClaimTypes.Role, "Admin") //如果是管理员
  };

  var claimsIdentity = new ClaimsIdentity(claims, "Work");//“,"Work"”可以省略,因为是缺省名

  var authProperties = new AuthenticationProperties
  {
   //AllowRefresh = true,
   //IsPersistent = false,
   //RedirectUri 
  };

  await HttpContext.SignInAsync("Work", new ClaimsPrincipal(claimsIdentity), authProperties);

  return Content("OK");
 }
  • 返回类型为Task<IActionResult> ,因为懒得写View,顺手写了句return Content("OK");
  • 从网站复制过来代码,AuthenticationProperties没有设置任何内容

运行起来以后不停的调用login,百度了半天,改了各种代码,最后把return Content("OK");改成return RedirectToAction("Index");一切OK!

揣摩原因可能是当 return Content("OK");时,自动调用AuthenticationProperties的RedirectUri,而RedirectUri为空时,自动调用自己。也不知道对不对。

这时候重视起RedirectUri,本来就要返回到returnUrl,是不是给RedirectUri赋值returnUrl就能自动跳转?

确实,return Content("OK");时候自动跳转了,return RedirectToAction("Index");无效。

最后把Task<IActionResult> 改成Task ,把return ...删除,一切完美!(弱弱问一句,是不是原来就应该这样写?我一直在走弯路?)

求助

User有属性Identities,看起来可以有多个Identity,如何有?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:


  • 本文相关:
  • 详解asp.net与asp.net core用户验证cookie并存解决方案
  • asp.net core中实现用户登录验证的最低配置示例代码
  • asp.net 提高首页性能的十大做法
  • asp.net反射简单应用实例
  • bin 和 app_code 文件夹介绍
  • mssql 存储过程调用c#编写的dll文件
  • vistual studio 2010 精品插件收集
  • asp.net dataset进行排序
  • .net 日志系统解析
  • asp.net中的“按需打印”(打印你需要打印的部分) 实现代码
  • js 父页中的单选按钮取值
  • asp.net使用datatable构造json字符串的方法
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved