深入解读ASP.NET Core身份认证过程实现_实用技巧

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

服务器文夹没有权限www.zgxue.com防采集请勿采集本网。

长话短说:上文我们讲了 ASP.NET Core 基于声明的访问控制到底是什么鬼?

我想问的是.NET Core 2.0好用吗?我也想转手做一下,又怕又是跟之前的什么mono一个模子刻出来的。现在已经有很多人在尝试了么?

今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证。

这个吧,可能有些东西你不太理解造成的。 关于性能提升的问题,net core是否性能提升10倍?答案是还真差不多!为什么呢?这是因为.net core为了跨平台,编译的方式使用的是dotnet publish -r 版本,例如发布到windows X64的机器上,使用的命令就

身份验证是确定用户身份的过程。 授权是确定用户是否有权访问资源的过程。

1. 万变不离其宗

显而易见,一个常规的身份认证用例包括两部分:

① 对用户进行身份验证

② 在未经身份验证的用户试图访问受限资源时作出反应

已注册的身份验证处理程序及其配置选项被称为“方案”,方案可用作一种机制,供用户参考相关处理程序的身份验证、挑战和禁止行为。

我们口头上常说的:

基于cookie认证方案,若认证成功,go on,若认证失败则跳转回登录页面;

基于基本身份认证(BA)方案,若认证成功,go on,若认证失败则给浏览器返回WWW-Authenticate标头, 浏览器会再次弹出认证窗口。

2. ASP.NET Core认证原理

在 ASP.NET Core 中,身份验证由IAuthenticationService负责,身份验证服务会调用已注册的身份验证处理程序来完成与身份验证相关的操作, 整个验证过程由认证中间件来串联。

其中有几个关键步骤

1、认证处理程序

可结合方案Scheme中的配置项AuthenticationSchemeOptions编写认证处理程序。

基于Cookie的认证方案可在Options项中可指定登录地址,

基于基本身份的认证方案可在Options项中指定用户名/密码;

2、身份认证程序继承自AuthenticationHandler类或IAuthenticationHandler接口。

核心认证函数可落地基于声明的访问控制,生成绑定了ClaimsPrincipal、Scheme的AuthenticationTicket对象; 无论认证成功/失败,函数返回AuthenticateResult对象。

挑战(对未认证的用户做出的反应): 例如返回登录页面

禁止(对已认证,但对特定资源无权访问做出的反应) : 例如返回提示字符串

以上均为服务注册过程

收到请求,认证中间件使用IAuthenticationService对HttpContext按照要求的scheme进行认证, 实际内部会调用第2步编写的认证处理程序。

以上认证原理,之前有一个近身实战: ASP.NET Core 实现基本身份验证。

源代码如下:https://www.zgxue.com/article/196974.htm

3. ASP.NET Core获取当前用户

基于声明的访问控制, 我们会在HttpContext.User属性存储身份信息。

var claims = new[] { new Claim(ClaimTypes.NameIdentifier,username), new Claim(ClaimTypes.Name,username), }; var identity = new ClaimsIdentity(claims, Scheme.Name); var principal = new ClaimsPrincipal(identity); Context.User = principal;

Web应用程序中获取当前登录用户, 有两种代码场合:

3.1 在控制器中获取当前登录用户

控制器是处理请求的 一等公民,天生自带HttpContext。

直接通过ControllerBase基类中包含的HttpContext属性,获取User对象。

实际上Razor Page、Razor View、Middleware均包含HttpContext属性/参数, 可直接使用。

3.2 在服务中获取当前登录用户

这个时候,服务是作为请求处理中的一个环节,并没有直接可用的HttpContext。

ASP.NET Core 提供了IHttpContextAccessor类能够注入此次请求中的HttpContext对象(依赖注入框架的作用)。

// 下面的用户实体类,需要获取当前登录用户,借助IHttpContextAccessor注入httpContextpublic class UserEntityService : IUserEntityService{ private IHttpContextAccessor _accessor; private readonly IMongoCollection<UserProfile> _users; public UserEntityService(IHttpContextAccessor accessor, IDefaultMongoDatabaseProvider databaseProvider) { _accessor = accessor; _users = databaseProvider.GetCollection<UserProfile>(CollectionNames.UserProfiles); } public Task<UserProfile> GetCurrentUserAsync() { var rawUser = this._accessor.HttpContext.User(); if (rawUser == null) { return null; } var filter = Builders<UserProfile>.Filter.Eq("UserId", rawUser.UserId); return _users.Find(filter).FirstOrDefaultAsync(); }}

我们不需要区分以上代码场合,在Controller或者Application 服务中使用ICurrentUser接口拿到登录用户。

旁白

个人认为,ASP.NET Core身份认证的源代码, 基于现实认知提炼而来,让我们惊叹于框架代码的的简洁精炼、层次分明。

基于声明的访问控制已成标准,ASP.NET Core/abp vnext 均提供了完善的支持。

到此这篇关于深入解读ASP.NET Core身份认证过程实现的文章就介绍到这了,更多相关ASP.NET Core 身份认证内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:Asp.net Core中实现自定义身份认证的示例代码ASP.NET学习CORE中使用Cookie身份认证方法详解在ASP.NET Core中使用Angular2以及与Angular2的Token base身份认证在ASP.NET Core中实现一个Token base的身份认证实例浅谈如何在ASP.NET Core中实现一个基础的身份认证

  window7 X64RC2 :https://download.microsoft.com/download/4/6/1/46116DFF-29F9-4FF8-94BF-F9BE05BE263B/DotNetCore.1.0.0.RC2-VS2015Tools.Preview1.exe  主要2113的是,教程里第一步说5261的是,如果是升级RC2,要把老4102的版本卸载掉。我1653安装时候,并没有手动卸载,而直接安装了RC2.  还就是,有些教程里说,安装RC2,需要安装VS2015update2.  具体更新教程,参考官方:https://www.microsoft.com/net/core#windows内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • asp.net让fileupload控件支持浏览自动上传功能的解决方法
  • c# 文件上传 默认最大为4m的解决方法
  • 看到本质而不是现象--解决asp.net cs0016的问题
  • .net工厂方法模式讲解
  • asp.net 上传大文件解决方案
  • asp.net 使用事务
  • asp.net错误捕获(错误处理)page_error事件使用方法
  • asp.net core 初探(发布和部署linux)
  • 在asp.net中获取当前页面的url的方法(推荐)
  • .net基础收集汇总
  • 如何安装aspnetcoremodule
  • asp.net core 上传文件服务器拒绝是为什么?
  • microsoft.aspnetcore.http 在哪个dll中
  • Asp.netCore怎么启停本地服务
  • aspnetcore2使用IdentityServer4完成分布式部署认...
  • asp.net core mvc 是不是未包含使用UA 动态选择dis...
  • microsoft.aspnetcore.authorization 干什么用
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧asp.net core中实现自定义身份认证的示例代码asp.net学习core中使用cookie身份认证方法详解在asp.net core中使用angular2以及与angular2的token base身份认证在asp.net core中实现一个token base的身份认证实例浅谈如何在asp.net core中实现一个基础的身份认证asp.net让fileupload控件支持浏览自动上传功能的解决方法c# 文件上传 默认最大为4m的解决方法看到本质而不是现象--解决asp.net cs0016的问题.net工厂方法模式讲解asp.net 上传大文件解决方案asp.net 使用事务asp.net错误捕获(错误处理)page_error事件使用方法asp.net core 初探(发布和部署linux)在asp.net中获取当前页面的url的方法(推荐).net基础收集汇总未将对象引用设置到对象的实例 (java正则表达式 pattern和matcheasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net对路径"xxxxx"asp.net汉字转拼音和获取汉字首字asp.net 计划任务管理程序实现,多线程任silverlightbutton图片切换样式实例代码asp.net 前台javascript与后台代码调用几个 asp.net 小技巧关于有些asp.net项目发布后出现网址乱码的.net core类库system.reflection.dispatcasp.net高效替换大容量字符实现代码treeview无刷新获取text及value实现代码asp.net mvc下使用bundle合并、压缩js与casp.net 分页潜谈
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved