手机版

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

时间:2021-08-27 来源:互联网 编辑:宝哥软件园 浏览:

前言

ASP。网核心2.2用户验证和授权有很详细和特贴心的介绍,我感兴趣的主要是这两篇:

甜饼干身份验证基于角色的授权我的项目有两类用户:

微信公众号用户,用户名为公众号的信息企业微信的用户,用户名为企业微信的使用者辩证码每类用户中部分人员具有"管理员"角色

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

公共类演示控制器:控制器{///摘要///企业微信用户使用的模块////摘要////返回/返回公共IActionResult Work(){ 0返回内容(用户。身份。用户名is角色(“管理员”);} ///摘要///企业微信管理员使用的模块////summary///returns/returns public IActionResult work admin(){ return Content(User .身份。用户名is角色(“管理员”);} ///摘要///微信公众号用户使用的模块////summary///returns/returns public IActionResult Mp(){ return Content(User .身份。用户名is角色(“管理员”);} ///摘要///微信公众号管理员使用的模块////摘要////返回/返回public IActionResult MpAdmin(){ 0返回内容(用户.身份。用户名is角色(“管理员”);}}下面咱一步一步实现。

第一步改造类启动

修改配置服务方法,加入以下代码

服务。添加身份验证('工作'//就是设置一个缺省的甜饼干验证的名字,缺省的意思就是需要写的时候可以不写。另外很多时候用CookieAuthenticationDefaults .AuthenticationScheme,这玩意就是字符串常量"饼干",)。添加Cookie ('Work ',//cookie验证的名字,"工作"可以省略,因为是缺省名选项={选项.LoginPath=新路径字符串('/演示/工作日志in ');//设置验证的路径选项接入路径=新路径字符串('/演示/工作被拒绝');//设置无授权访问跳转的路径}).AddCookie('Mp ',option={ option .LoginPath=新路径字符串('/Demo/MpLogin ');选项接入路径=新路径字符串('/Demo/MpDenied ');});修改安装使成形方法,加入以下代码

应用程序.UseAuthentication();第二步添加验证

公共异步任务工作登录(字符串返回网址){ var索赔=新列表索赔{新索赔类型(声明类型。名称,"用户标识"),新声明(声明类型)。角色,"管理员")//如果是管理员};定义变量债权实体=新债权实体(债权,'工作');//"工作"可以省略,因为是缺省名var authProperties=new AuthenticationProperties { allow refresh=true,//expirectc=datetime offset .UtcNow。添加分钟(10),//身份验证票证过期的时间。此处设置的//值覆盖了用添加Cookie设置的//CookieAuthenticationOptions的ExpireTimeSpan选项IsPersistent=false,//持久化保存,到底什么意思我也不太清楚,哪位兄弟清楚的话,盼解释//issuedtc=日期时间偏移量,//颁发身份验证票证的时间RedirectUri=returnUrl?/Demo/Work ' };等待HttpContext .同步签名('工作',新的ClaimsPrincipal(claimsIdentity),authProperties);}公共IActionResult工作被拒绝(){返回禁止();}公共异步任务标记(字符串返回网址){变量声明=新列表声明{新声明类型(声明类型.名称,' OpenId '),新声明(声明类型。角色,"管理员")//如果是管理员};var索赔方=新索赔方(声明,' Mp ');//,“Mp”不能省略,因为不是缺省名var authProperties=new AuthenticationProperties { allow refresh=true,IsPersistent=false,RedirectUri=returnUrl?/Demo/Mp ' };等待HttpContext .signinsync(' Mp ',new ClaimsPrincipal(claimsIdentity),authProperties);} public IActionResult MpDenied(){ return禁止();}第三步添加授权

就是在对应的行动前面加[授权]

///摘要///企业微信用户使用的模块////summary////returns/returns[authorizationscheme=' Work '//缺省名可以省略)]公共IActionResult Work(){ 0返回内容(用户。身份。用户名is角色(“管理员”);} ///摘要///企业微信管理员使用的模块////summary///returns/returns[authorized(authenticationscheme=' Work ',Roles=' Admin ')]public IActionResult Work Admin(){ return Content(User .身份。用户名is角色(“管理员”);} ///摘要///微信公众号用户使用的模块////summary///returns/returns[Authorize(AuthenticationSchemes=' Mp ')]public IActionResult Mp(){ return Content(User .身份。用户名is角色(“管理员”);} ///摘要///微信公众号管理员使用的模块////summary///returns/returns[authenticationscheme=' Mp ',Roles=' Admin ']public IActionResult Mpadmin(){ return Content(User .身份。用户名is角色(“管理员”);} Ctrl+F5运行,截屏如下:

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

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

公共异步任务结果登录(字符串返回网址){ var索赔=新列表索赔{新索赔类型(声明类型。名称,"用户标识"),新声明(声明类型)。角色,"管理员")//如果是管理员};定义变量债权实体=新债权实体(债权,'工作');//"工作"可以省略,因为是缺省名var authProperties=new AuthenticationProperties {//allowerefresh=true,//IsPersistent=false,//RedirectUri };等待HttpContext .同步签名('工作',新的ClaimsPrincipal(claimsIdentity),authProperties);返回内容("确定");}返回类型为TaskIActionResult,因为懒得写查看,顺手写了句返回内容("确定");从网站复制过来代码,身份验证属性没有设置任何内容运行起来以后不停的调用登录,百度了半天,改了各种代码,最后把返回内容("确定");改成返回RedirectToAction(' Index ');一切好的!

揣摩原因可能是当返回内容("确定");时,自动调用身份验证属性的RedirectUri,而RedirectUri为空时,自动调用自己。也不知道对不对。

这时候重视起RedirectUri,本来就要返回到返回Url,是不是给RedirectUri赋值返回统一资源定位器就能自动跳转?

确实,返回内容("确定");时候自动跳转了,返回RedirectToAction(' Index ');无效。

最后把TaskIActionResult改成任务,把返回.删除,一切完美!(弱弱问一句,是不是原来就应该这样写?我一直在走弯路?)

求助

用户有属性身份,看起来可以有多个身份,如何有?

总结

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

版权声明:asp.net core2.2多用户验证与授权示例详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。