宝哥软件园

ASP.NET核心身份详细介绍(3)

编辑:宝哥软件园 来源:互联网 时间:2021-09-06

自2005年ASP.NET 2.0以来,手机、平板等Web应用中认证授权的处理发生了很多变化,所以当时为了适应这种变化引入了ASP.NET会员制,但随着时间的发展,一些社交网站或程序聚集了大量用户,比如脸书。推特、QQ等。此时用户希望利用自己在这些社交网站中的身份登录到当前的网站,从而避免注册这种琐碎而必要的操作,用户也不需要记住大量的账号密码。

随着互联网的发展,越来越多的开发者不仅关注具体业务代码的编写,还关注应用代码的单元测试,这已经成为开发者关注的核心。因此,2008年,ASP.NET团队引入了MVC框架,帮助开发人员轻松构建单元测试,开发人员希望他们的Membership系统也能这样做。

基于此,ASP.NET身份应运而生。

身份需要解决的问题

很多开发者说不愿意用Identity,自己实现要方便很多。好,那么需求来了?以下是我对这次任务的要求。

身份系统

它可以被所有ASP.NET框架同时使用(Web MVC、Web Forms、Web Api、SignalR),可以应用于构建Web、手机、存储或混合应用。用户配置文件可以轻松扩展

它可以根据用户配置文件进行扩展。坚持

默认情况下,用户信息存储在数据库中,可以使用EF支持持久性。(可见EF其实只是身份的一个功能点。)您可以控制数据库模式,更改表名或主键的数据类型(int、string),并使用不同的存储机制(如NoSQL、DB2等)。)进行单元测试。

WEB应用程序可以进行单元测试,并且可以为ASP.NET身份编写单元测试角色机制

提供了角色机制。可以使用不同的角色来限制不同的权限,并且可以轻松地创建角色并将其添加给用户。支持基于声明的

需要支持基于声明的认证机制,其中用户身份是一组声明,可以比角色更有表现力,角色只是一个bool值,表示是否是成员。第三方社交登录

方便使用第三方登录,如微软账号、脸书、推特、谷歌等。并存储用户特定的数据。封装为中间件

基于中间件实现,不要依赖特定的项目。基于Authorzation中间件实现,而不是使用FormsAuthentication来存储cookie。NuGet包提供了

将其发布为Nuget包,可以轻松迭代和修复bug,可以灵活提供给用户。以上是我的要求。如果您要打包这样一个用户身份验证组件,您会想到这些功能点吗?您会如何设计它们?

让我们看看身份是如何设计的。

入门指南

我们从入口看一下它的用法。首先,我们打开Startup.cs文件,然后添加以下代码:

公共类启动{ public void ConfigureServices(IServiceCollection services){ services } .AddDbContextApplicationDbContext(选项=选项.UseSqlServer(配置[' data : default connection : connection string ']);服务AddIdentityApplicationUser,IdentityRole(options={ options .饼干。应用程序cookie。authenticationscheme=“应用程序cookie”;选项饼干。应用程序cookie。cookiename=' Interop}) .AddEntityFrameworkStoresApplicationDbContext().AddDefaultTokenProviders();}公共无效配置(应用程序生成器应用){ //使用了认证中间件做身份认证应用程序.UseIdentity();}}在配置服务中,先是注册了数据库上下文,然后又服务AddIdentity()我们看一下里面都注册了哪些服务呢?

公共静态标识构建器AddIdentityTUser,TRole(这是服务收集服务,操作标识选项设置操作)其中,TUser :类,TRole :类{ //这个就是被身份使用的服务。添加身份验证(选项={ //这是externalcokokieauthenticationscheme选项的默认值signing scheme=new identity bookeooptions().externalcokokieauthenticationscheme;});//注册IHttpContextAccessor,会用到服务tryaddsingletonihtpcontextaccessor,HttpContextAccessor();//身份服务服务tryaddsingletonientitymarkerservice();服务TryAddScopedIUserValidatorTUser,UserValidatorTUser();服务tryaddscopedipassworvalidatortuser,passworvalidatortuser();服务tryaddscopedipassworhashertuser,passworhashertuser();服务TryAddScopedILookupNormalizer,upper rinvariantlookpnormalizer();服务TryAddScopedIRoleValidatorTRole,RoleValidatorTRole();//错误描述信息服务tryaddscopededidentityrdescriptor();服务tryaddscopedsecuritystampvalidator,SecurityStampValidatorTUser();//身份当事人工厂服务tryaddscopedieuserclaimprinciplefactorytuser,user claimsprinciplefactorytuser,TRole();//三大对象服务TryAddScopedUserManagerTUser,UserManagerTUser();服务tryaddscopedsigningmanagerttuser,signingmaragettuser();服务TryAddScopedRoleManagerTRole,RoleManagerTRole();if (setupAction!=null){ 0服务。配置(设置操作);}返回新的IdentityBuilder(类型of(TUser),类型of(TRole),服务);}看了以上代码后,基本上知道了身份他的设计的一个架构了,通过此结构我们也能够学习到我们自己封装一个中间件的时候,该怎么样来组织我们的代码结构,怎么样的利用ASP。网核心给我们提供的依赖注入来更好的解耦,下面我们来看一下通过以上代码我们能够学到什么东西:

1、 在公共静态标识生成器附加标识用户,TRole(这是服务收集服务,操作标识选项设置操作)这个扩展方法中,提供了一个参数操作标识选项,这个是干什么用的呢?这个是我们在设计一个中间件的时候,有需要外部提供的参数,就会设计一个选择的类用来接受外部的参数,然后封装为一个行动委托的方式提供。在使用到的地方就可以以IOption xxx的形式注入进来使用了。

2、服务TryAddScopedInterface,Implement(),这个注册方式就是说,如果检测到国防情报部容器里面已经有了当前要注册的连接或者服务,就不会再次注册,没有才会注册进去。那么为什么此处要这样用呢?这是因为如果用户已经实现了此接口并且已经注册的容器当中的话,就使用用户注册的,而不是中间件自身的。用户就能很好的对中间件提供的功能进行自定义了,这就是面向对象的(=面向对象)中的多态性,这就是里氏替换原则。

3.如果你能理解第2条,那么你应该知道为什么你在服务中注册了带有错误描述信息的IdentityErrorDescriber,这也可以解决你想提示账号密码错误,但是Identity输出是提示英文问题的问题。

4.三个对象,这是同一性的核心。所以,要学习认同,看完博客ASP.NET芯的《认同导论》(一、二)学习这三个对象就够了。

SignInManager:主要处理与注册和登录相关的业务逻辑。UserManager:处理用户相关的增删、密码修改、角色增删等。角色管理器:添加、删除、更新等。与角色相关。有些学生可能会好奇。他们不依赖特定的数据库或EF。他们是如何添加、删除和更改查询的?

此时,需要几个商店接口。以下是在标识中定义的存储接口:

IQueryableRoleStore iqueryableuser store IRoleClaimStore IRoleStore iuseruthenticationtokenstore IUserClaimStore IUserEmailStore IUserLockoutStore IUse Rlogin store iuserpasswordstore iuserphonumberstore iuserrolestore iusersecuritystampstore iusertwfactor有这些接口,是不是豁然开朗了?最初,身份是以这种方式实现的持久机制,它依赖于抽象的接口而不是具体的细节。这就是面向对象中依赖反转的原理。

身份和实体框架

我相信在理解了前一章之后,身份和实体框架之间的关系就很容易理解了。是的,EF只是针对上述商店界面的实现。我不相信你能看懂截图的源代码:

IdEntity开头的类文件是需要持久化的已定义实体对象,Store结尾的是接口的实现。

第三方的身份实现

除了官方默认提供的持久性库之外,还有一些第三方库,当然也可以使用ADO.NET或者Drapper自己实现。

MangoDb的身份实现:https://github.com/tugberkugurlu/AspNetCore.身份. MongoDB

LinqToDB的目标是由Identity:https://github.com/linq2db/LinqToDB.提供的实现身份

摘要

这篇博文写了相当长的时间,一方面是因为我们在思考如何让人们更好地理解它,而不仅仅是使用它。因为关于Identity的用法和代码的文章太多了,但最后大家还是用不上。后来我想,如果别人想了解你的库或者代码,让他们知道它诞生的背景是非常重要的,因为这是设计的初衷。另一方面,在Connect() 2016大会上,NET Core发布了1.1版本。除了将项目升级到1.1之外,它也在学习1.1中的一些新东西,以便更好地共享。

更多资讯
游戏推荐
更多+