自学内容网 自学内容网

ShenNiusModularity项目源码学习(4:身份认证)

  ShenNiusModularity项目有两套启动方式,一种是ShenNius.Admin.Mvc项目启动,该项目为MVC模式,带前台页面,也有后台服务,另一种是ShenNius.Admin.Hosting,该项目启动后仅提供后台服务,供其它前台项目调用。本文学习并分析ShenNius.Admin.Mvc项目中的身份认证方式。
  ShenNiusModularity项目启动时,在ShenNius.Admin.Mvc项目的Program文件内,调用ShenniusAdminMvcModule,其内部又依赖ShenNius.Admin.API项目的ShenniusAdminApiModule类,在该类中,启动时根据启动项目中的JwtSetting设置判断是否启动jwt身份认证。ShenNius.Admin.Mvc项目的appsettings.json没有相关jwt设置,因此采用基于Cookie的身份认证方式,主要代码如下所示:

 context.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
  {
      o.Cookie.Name = "ShenNius.Admin.Mvc";
      o.LoginPath = new PathString("/sys/user/login");
      o.LogoutPath = new PathString("/sys/user/Logout");
      o.Cookie.HttpOnly = true;
  });

  在Admin.Areas.Sys.Controllers.UserController的Login函数内,当通过用户验证后,会将用户名称、上次登录时间、电话、邮箱、是否管理员等信息保存为ClaimsPrincipal对象实例内,并调用HttpContext.SignInAsync函数将信息保存到Cookie内。

var identity = new ClaimsPrincipal(
   new ClaimsIdentity(new[]
       {
              new Claim(JwtRegisteredClaimNames.Sid,result.Id.ToString()),
              new Claim(ClaimTypes.Name,result.LoginName),
              new Claim(ClaimTypes.WindowsAccountName,result.LoginName),
              new Claim(ClaimTypes.UserData,result.LastLoginTime.ToString()),
              new Claim(ClaimTypes.MobilePhone,result.Mobile),
              new Claim(ClaimTypes.Email,loginModel.Email),
              new Claim("TrueName",result.TrueName),
              new Claim("TenantId",result.TenantId.ToString()),
               new Claim("IsAdmin",isAdmin.ToString())
       }, CookieAuthenticationDefaults.AuthenticationScheme)
  );
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, identity, new AuthenticationProperties
{
    ExpiresUtc = DateTime.UtcNow.AddHours(24),
    IsPersistent = true,
    AllowRefresh = false
});

  项目采用接口IShenNiusContext及其实现类ShenNiusContext获取当前登录用户信息,其内部实现也是从HttpContext.User属性中获取用户名等信息,在此不再赘述,有兴趣的可以查看ShenNius.Infrastructure.ShenNiusContext源码。该接口在项目启动时已注册服务。

context.Services.AddScoped<IShenNiusContext, ShenNiusContext>();

参考文献:
[1]https://gitee.com/shenniu_code_group/shen-nius.-modularity


原文地址:https://blog.csdn.net/gc_2299/article/details/144070786

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!