欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Asp.Net Core中基于Session的身份验证的实现

程序员文章站 2023-12-04 22:31:46
在asp.net框架中提供了几种身份验证方式:windows身份验证、forms身份验证、passport身份验证(单点登录验证)。 每种验证方式都有适合它的场景:...

在asp.net框架中提供了几种身份验证方式:windows身份验证、forms身份验证、passport身份验证(单点登录验证)。

每种验证方式都有适合它的场景:

1.windowss身份验证通常用于企业内部环境,windows active directory就是基于windows平台的身份验证实现;
2.forms身份验证是asp.net框架中提出的另一种验证方式;
3.passport身份验证是微软提供的基于自己的lives账号实现的单点认证服务。

asp.net core验证码登录遇到两个小问题

第一是在asp.net core中引用dll,以往我们引用dll都是直接引用,在core里这样是不行的,必须基于nuget添加,或者基于project.json添加,然后保存vs会启动还原类库。

第二就是使用session的问题,core里使用session需要添加session类库。

第一步:在你的项目上基于nuget添加:

install-package microsoft.aspnetcore.session -ver 2.0

install-package microsoft.aspnetcore.http.extensions -ver 2.0

第二步:修改startup.cs

在startup.cs找到方法configureservices(iservicecollection services) 注入session(这个地方是asp.net core pipeline):

services.addsession();

接下来我们要告诉asp.net core使用内存存储session数据,在configure(iapplicationbuilder app,...)方法中添加代码:

app.usesession();

基于session的身份验证实现

这种方式可能是在asp.net框架提供的几种验证方式之外的最常用的身份验证方式。

实现原理

1.客户端发送身份认证数据到服务器端
2.服务器收到并验证后将用户信息保存到session对象中,然后生成对应的标识并将标识写入cookie中
3.当客户端下次请求时带上该cookie标识
4.服务器通过该cookie标识从session对象中获取对应的用户信息

asp.net core中的session身份认证实现

​ 基于session的身份认证并不是asp.net core中推荐的认证方式,因为asp.net core中有更高级的forms身份认证方式,不过在这里不是本文章的主题,我们只讲如何在asp.net core中实现基于session的身份认证。

我们先创建一个用于代码演示的基础项目

dotnet new razor -n sessionsample

在startup.cs中启用session功能

public class startup
{
  public void configureservices(iservicecollection services)
  {
    ...
    //添加session服务
    services.addsession();
  }
  public void configure(iapplicationbuilder app, ihostingenvironment env)
  {
    ...
    //启用session
    app.usesession();
    app.usemvc();
  }
}

创建一个mypage.cs文件,我们在该类中实现了一个islogin属性,该属性用来判断用户的登陆状态:

public class mypage:pagemodel
{
  protected bool islogin
  {
    get
    {
      string userid = null;
      //从sessin中获取userid对应的用户信息来判断用户是否登陆
      if (httpcontext.session.trygetvalue("userid", out byte[] bytes))
      {
        userid = encoding.utf8.getstring(bytes);
      }
      return !string.isnullorwhitespace(userid);
    }
  }
}

我们已经实现了验证,现在缺少的是如何在session中添加userid的信息,我们来创建一个login页面:

dotnet new page -n login
public class loginmodel : mypage
{
  public void onget()
  {
    if(islogin)
    {
      //如果已经登陆就跳转到/index页面
      redirecttopage("/index");
    }
  }
  public iactionresult onpost()
  {
    //这里我们将userid写入session中
    httpcontext.session.setstring("userid", guid.newguid().tostring());
    return redirecttopage("/index");
  }
}

给现有的页面添加验证功能,打开index页面,添加如下代码:

public class indexmodel : mypage
{
  public iactionresult onget()
  {
    if (!islogin)
    {
      return redirecttopage("/login");
    }
    return page();
  }
}

ok!我们已经实现了身份认证。

源代码

总结

​ 我们描述了传统asp.net中提供的几种身份认证方式,并在asp.net core实现了一种虽然不标准但是常用的身份认证机,看起了与asp.net中的用法并没有什么区别。

​ 在asp.net core中这种用法似乎并不受欢迎,可能是因为asp.net core提供了更高级的身份验证机制吧,那么这篇文章存在的意义呢?权当做是对asp.net的一种纪念吧!

现在是.net core的时代,让.net洗洗睡吧!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。