Skip to main content

使用Cookie完成Asp.net Core认证

分类:  Asp.net Core认证和授权 标签:  #Asp.Net core基础 #认证 #.Net 发布于: 2023-05-27 18:46:16

关于如何使用ASP.netCore 提供的Identity库,我们前面通过几篇文章简单的带领大家入门了,同时我们也捎带讲述一些最为基本的ASP.net Core认证的基本理念,那么接下来我们将讲述ASP.net Core提供的最基本的认证的设计理念和框架,当然大家也可以继续使用Identity库。

今天我们这篇文章算是开篇,简简单单的一个入门的教程,如何使用CookieAuthencationSchema来认证用户,这篇讲完之后,我们讨论一下ASP.net Core对于认证的基本解决方案和理念,讲完这个之后再讲述授权。

还是先复习一下基本的理论:ASP.net Core主要是使用接口IAuthencationService服务配合AuthencitationHandler以及Handler的配置,然后最终在认证中间件里完成认证,同时需要提及的是ASP.net Core认证的基础是以Claim为基础的认证。这些理论我们后面也会详细的讨论,我们今天来展示一个简单的教程:如何使用CookieAuthencationSchema完成认证,而不使用Identity集成库。

首先我们来生成一个基于RazorPage的应用:

dotnet  new webapp -o WebApp1

 

然后进入到项目WebApp1 的目录中:cd WebApp1

在项目目录中启动vs code: code .

 

在项目中打开Startup.cs文件:

首先添加我们需要的包:


因为我们主要是使用cookie来进行认证的,所以我们需要cookie这个扩展包。

引用好包之后我们来配置ASP.net Core 使其可以来处理认证,这里我们前面最基本的理论已经讨论过了,我们需要启用基于cookie的认证,第一步是必须在StartupConfigureService中启用认证的服务,可以考虑添加下图的代码:


这段代码虽然看起来只有几句,但是这段代码里包含的意义我们需要讨论一下:

首先我们再次强调一下ASP.netCore是使用IAuthencationService这个接口和AuthencationMiddlrware来使用的,基于ASP.net Core的架构我们是需要在Startup.cs的configureService方法中添加基于IAuthencationServer的实现,要注意的是services.AddAuthentication() 即是使用service(接口:  IServiceCollection) 的扩展方法添加服务,我们可以查看扩展方法的代码里是否和我们以前的语法一致,例如使用带有范围的Add方法添加服务, 我们找到Microsoft.AspNetCore.Authencation名称空间就可以看到IApplicationBuilder和IServiceCollection) 两个接口的扩展方法:

AddAuthencation() 扩展方法的定义:


然后继续跟一下: AddAuthenticationCore()


跟踪到这里之后,就可以看到我们熟悉的语法了

TryAddScoped<IAuthenticationService, AuthenticationService>()

从这个部分的代码也说明了我们的确是在首先向DI容器中注册AuthenticationService的方法了。

关于service.addAuthencation()这个方法我们就讨论到这里了。

接着看第二部分,也是非常重要的一点:


需要注意的是这里AddAuthentication()方法中的参数,这个参数的作用是用于指定在认证服务中默认会使用什么Schema, 我们必须要指定一个默认的AuthencationSchema, 如果不指定,那么在给类或者方法指定需要认证的时候会出错,这里是强调我们必须指定默认的AuthencationSchema.

 

那么什么是AuthencationSchema呢?

我们前面讨论过更高的层面我们是通过IAuthencationService和Authentication中间件来完成认证的,实际上IAuthencationService 这个服务里最终完成认证这个流程的是由实现了IAuthencationHandler的类完成实际的工作,同时IAuthencation还有一个泛型的定义,那就是IAuthencationHandler<Toptions>,这里的TOpionts也即是我们的配置项,AuthencationSchema 代表的实际意义就是AuthencationHandler +Toptions(配置)就是一个Schema. 

所以这一行指定其实就是CookieAuthencationDefaults.AuthencationSchema指定使用cookie认证的schema.

再回到这个图:


我们注意一下AddCookie方法,这个方法实际上也是我们的一个扩展方法,这个扩展方法的意思在于:


实际上定义和传入我刚刚讲过的AuthenHandler和配置的扩展方法,不过该方法是AuthencationBuilder的扩展方法就是了。

好了,我们前面展开了那么多来讲,实际上也是为了讲述一个基本的原则, 也就是注册认证服务的时候,我们需要选择不同的认证模式也就是我们说的AuthencationSchema,如下是ASP.net Core自带的AuthencationSchame, 当然你可以自定义一个Schema, 不过这不在我们文章讨论的方位之内:


前面这个部分的基础知识我们学习完了,那么我们继续我们这个小小的项目, 我们刚刚在Startup.ConfigureService中启用了认证服务,那么我们现在需要启用中间件,这个倒是容易,秩序要在Startup.Configure中如下图的添加一行代码就可以了


这样我们就启用了认证的中间件了。

刚刚我们在AddCookie的时候添加了两个选项,那就是登录和登出,我们先来添加/login选项:

添加一个Login.cshtml的页面和一个类Login.cshtml.cs

两个文件的内容分别如下:
Login.cshtml:


这个页面非常简单,仅仅是展示一个简单的登录界面,然后使用Post方法通过login.cshtml.cs中的onPost 方法登录,

Login.cshtml.cs 方法体如下:


然后定义类:

注意绑定两个表单的属性:


然后我们主要的登录是在onPost方法,那么下面是OnPost 方法的主题,答题内容如下:


首先我们不管用户输入的用户名是啥,只要他输入了用户名和用户密码,我们就算他身份检验通过,身份检验通过之后我们需要生成认证中需要的IdentityPrinpcal.  这个步骤是这样的:

先生成Cliam列表,然后生成CliamIdentity,最后生成IdentityPrinpcal,  最后使用扩展方法:SignInAsync 来生成cookie,并返回到客户端。

如下图:


这里展示的就是存储在cookie里的Identity,  如果要测试一下登录之后的效果,也很简单,只需要挑一个页面,我们这里挑Privaty.cshtml.cs, 添加一个特性[Authorize],  表特性表示使用默认的schema 来认证,如下图:


测试的时候先将本机的cookie清除掉,然后访问/Privacy 页面,这个时候就会发现重定向到了登录页面,随便输入用户名密码之后,就会显示Privacy页面的内容了。

如果需要SignOut, 也很简单如下图的代码实例:


好了一个最简单的认证的例子讲完了,虽然这个例子非常简单,也算是一个step by step的教程,同时将ASP.net Core的认证框架,最基础的理论也稍微理了一遍,下一章我们开始详细的理解一下ASP.net core中关于认证的一些关键概念。