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

 更新时间:2021年9月22日 10:01  点击:1347

前言

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

  • cookie身份验证
  • 基于角色的授权

我的项目有两类用户:

  • 微信公众号用户,用户名为公众号的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,如何有?

总结

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

[!--infotagslink--]

相关文章

  • Springboot如何实现Web系统License授权认证

    这篇文章主要介绍了Springboot如何实现Web系统License授权认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-28
  • 微信小程序用户授权最佳实践指南

    这篇文章主要给大家介绍了关于微信小程序用户授权最佳实践的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-08
  • MySQL中用户授权以及删除授权的方法

    这篇文章主要介绍了MySQL中用户授权以及删除授权的方法的相关资料,需要的朋友可以参考下...2015-12-27
  • 详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现

    这篇文章主要介绍了详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现的相关资料,需要的朋友可以参考下...2017-03-13
  • 微信小程序授权登录的优雅处理方式

    这篇文章主要给大家介绍了关于微信小程序授权登录的优雅处理方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 完美解决mysql客户端授权后连接失败的问题

    下面小编就为大家带来一篇完美解决mysql客户端授权后连接失败的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-03
  • ASP.NET Core学习之使用JWT认证授权详解

    这篇文章主要给大家介绍了关于ASP.NET Core学习之使用JWT认证授权的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-09-22
  • Springboot shiro认证授权实现原理及实例

    这篇文章主要介绍了Springboot shiro认证授权实现原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-11
  • asp.net5中的用户认证与授权(1)

    Visual Studio 2015 Preview 除了给我们带了了C# 6.0的新语法、跨移动的开发以外,还给我们带来了ASP.NET5(也就是之前被称作下一代ASP.NET的ASP.NET vNext)。本文给大家介绍asp.net5中的用户认证与授权(1),需要的朋友可以参考下...2021-09-22
  • uni-app微信小程序登录授权的实现

    这篇文章主要介绍了uni-app微信小程序登录授权的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-22
  • asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

    身份验证是确定用户身份的过程。 授权是确定用户是否有权访问资源的过程。本文主要介绍了asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案,感兴趣的可以了解一下...2021-09-22
  • MVC微信网页授权获取用户OpenId

    这篇文章主要为大家详细介绍了MVC微信网页授权,在模板页中获取用户openid,感兴趣的小伙伴们可以参考一下...2021-09-22
  • mysql5.7创建用户授权删除用户撤销授权

    这篇文章主要介绍了mysql5.7创建用户授权删除用户撤销授权的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2017-02-19
  • 微信开发之网页授权获取用户信息(二)

    本文给大家阐述的微信开发基于yii2.0框架,对微信开发之网页授权获取用户信息相关知识感兴趣的朋友通过本文学习吧...2016-01-12
  • PHP实现微信网页授权开发教程

    这篇文章主要为大家分享了PHP实现微信网页授权开发教程,开发者可以通过授权后获取用户的基本信息,感兴趣的小伙伴们可以参考一下...2016-01-21
  • .NET Core 2.2新增的部分功能使用尝鲜指南

    这篇文章主要给大家介绍了关于.NET Core 2.2新增的部分功能使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧...2021-09-22
  • 手把手教你AspNetCore WebApi认证与授权的方法

    这篇文章主要介绍了手把手教你AspNetCore WebApi认证与授权的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 关于Redis未授权访问的问题

    这篇文章主要介绍了Redis未授权访问的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-07-12
  • windows 2008 iis 提示401未授权 由于凭据无效,访问被拒绝

    这篇文章主要为大家分享一个自己在使用windows 2008服务器时碰到提示iis 401 未授权: 由于凭据无效,访问被拒绝问题的解决方法总结...2016-01-27
  • springboot对接第三方微信授权及获取用户的头像和昵称等等

    这篇文章主要介绍了springboot对接第三方微信授权及获取用户的头像和昵称等等,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-26