asp.net core2.2多用户验证与授权示例详解
 更新时间:2019年01月10日 11:06:54   作者:毛毛虫  

这篇文章主要给大家介绍了关于asp.net core2.2多用户验证与授权的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言
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,如何有?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对华域联盟的支持。

您可能感兴趣的文章:ASP.NET Core自定义中间件如何读取Request.Body与Response.Body的内容详解ASP.NET Core使用自定义验证属性控制访问权限详解ASP.NET Core自定义本地化教程之从文本文件读取本地化字符串.NET Core2.1如何获取自定义配置文件信息详解.Net Core官方JWT授权验证的全过程详解.Net Core 权限验证与授权(AuthorizeFilter、ActionFilterAttribute).NET Core授权失败自定义响应信息的操作方法

core2.2
多用户验证
授权

相关文章
ASP.NET对大文件上传的解决方案在ASP.NET 开发的过程中,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的做到多线程的操控和上传进度的显示。笔者在此给大家推荐一款简单易用的上传组件,从而快速便捷得解决了 ASP.NET 中的大文件上传问题。
2015-08-08
正则方式的自动小偷抓网程序公司里面有许多数据没人去录入,做一个抓取网页的程序,以前做CMS系统的时候涉及过,不过这次的处理HTML上和以前做了些区别 2011-11-11
FileUpload1 上传文件类型验证正则表达式FileUpload1 上传文件类型验证正则表达式… 2006-10-10
.Net语言Smobiler开发之如何仿微信朋友圈的消息样式这篇文章主要介绍了.Net语言Smobiler开发平台如何仿微信朋友圈的消息样式?本文为大家揭晓答案 2016-09-09
c#中带头(声明)的xml(封装)生成c#中带头(声明)的xml(封装)生成代码。 2009-07-07
ASP.NET实现大文件上传功能这篇文章主要为大家详细介绍了ASP.NET实现大文件上传功能,解决了 ASP.NET 中的大文件上传问题,感兴趣的朋友可以参考一下 2016-07-07
读取XML并绑定至RadioButtonList实现思路及演示动画读取XML的文档,可以使用System.Data.DataSet类别中的ReadXml()方法,在aspx网页上拉一个RadioButtonList控件,用来显示XML的数据,接下来,用DataSet去读取刚才写好的获取XML文件的属性,即可完成 2013-01-01
asp.net中EXCEL数据导入到数据库的方法这篇文章主要介绍了asp.net中EXCEL数据导入到数据库的方法,实现读取excel数据并导入到SQL Server数据库的功能,是非常实用的技巧,需要的朋友可以参考下 2015-01-01
asp.net下DataSet.WriteXml(String)与(Stream)的区别asp.net下DataSet.WriteXml(String)与(Stream)的区别… 2007-04-04
ASP.NET页面传递值的方式介绍面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值、存储对象传值、ajax、类、model、表单等。但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。

2012-12-12

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。