ASP.NET Core 2.0 MVC - 获取当前登录用户信息
一、前言
上篇实战完成后,没想到会有那么多的圈友给了那么多的支持,甚至连只是作为代码仓储的git上也给了一些小星星,真的感觉很惶恐啊,哈哈哈,毕竟代码写的很烂啊。由于上一篇只是大概说了下项目,所以准备写下这篇详细说下自己对于获取当前登录用户的设计与实现,原本准备上周末就完成的这篇,结果周六一起来,发现自己起水痘了,嗯,很悲催。。。请了一个星期的假,今天好歹头不痛,不发烧能看电脑了,就努力努力赶出来吧。
获取当前登录用户的整体思路,我们可以通过创建一个静态的用户类,存储当前登录的用户。通过将属性值存储在session中,从而存储到服务器的内存中,做到可以在系统全局中获取当前登录用户的数据信息。
.NET Framework平台下面的MVC与.NET Core平台下面的MVC,对于Session的使用上存在着一些的差异,主要在于如何获取到Session对象。在传统的MVC项目中我们可以直接使用HttpContext.Current.Session获取到session,从而做到对于数据的取值、赋值;而在ASP.NET Core MVC中,并没有HttpContext.Current.Session这个静态类,通过查阅微软的文档可知,我们可以通过注入IHttpContextAccessor对象的方式从而获取到session对象,解决方案如下所示。
二、实现思路
首先,在ASP.NET Core 中使用Session,我们需要将Session注入到ASP.NET Core的管道(pipeline)中,和我们使用MVC的方式相同,在ConfigureServices(IServiceCollection services)中,添加
services.AddSession();
在Configure(IApplicationBuilder app, IHostingEnvironment env)中添加
app.UseSession();
这样,我们就可以在MVC中使用到Session了。当然现在也只是能在Controller中获取到Session对象,如果想在别的类文件中使用到Session对象,我们需要注入IHttpContextAccessor对象。这里,我们可以使用nuget添加Microsoft.AspNetCore.Http.Extensions这个程序集,方便我们对于Session进行操作。
因为我们采用静态类作为当前登录用户的载体,而静态类不能拥有实例构造函数,所以我采用创建一个配置方法来进行注入,CurrentUser类如下所示。
public static class CurrentUser
{
#region Initialize private static IHttpContextAccessor _httpContextAccessor; private static ISession _session => _httpContextAccessor.HttpContext.Session; public static void Configure(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
} #endregion #region Attribute /// <summary>
/// 用户主键
/// </summary>
public static string UserOID
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserOID");
set => _session.SetString("CurrentUser_UserOID", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
///用户编号
/// </summary>
public static long UserId
{
get => _session == null ? : Convert.ToInt64(_session.GetString("CurrentUser_UserId"));
set => _session.SetString("CurrentUser_UserId", value != ? value.ToString() : "");
} /// <summary>
/// 用户姓名
/// </summary>
public static string UserName
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserName");
set => _session.SetString("CurrentUser_UserName", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 用户登录账户
/// </summary>
public static string UserAccount
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserAccount");
set => _session.SetString("CurrentUser_UserAccount", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 用户头像地址
/// </summary>
public static string UserImage
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserImage");
set => _session.SetString("CurrentUser_UserImage", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 用户角色
/// </summary>
public static string UserRole
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserRole");
set => _session.SetString("CurrentUser_UserRole", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 主页地址
/// </summary>
public static string UserPage
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserPage");
set => _session.SetString("CurrentUser_UserPage", !string.IsNullOrEmpty(value) ? value : "");
} #endregion
}
CurrentUser
当我们创建好了这样一个静态类后,我们就可以在登录成功后,将当前登录的用户信息赋值给这个静态类,这样我们就可以在需要使用到的地方直接使用CurrentUser这个静态类即可。在当时实际使用后发现,想要获取到登录后存储的用户信息,则必须在Controller的构造方法中调用CurrentUser的Configure方法,无形中还是增加了许多的工作量。
Controller的构造函数示例代码如下:
[Area("Administrator")]
[Authorize(Policy = "Administrator")]
public class HomeController : DanvicController
{
#region Initialize
private readonly ApplicationDbContext _context;
private readonly ILogger _logger;
private readonly IHomeService _service;
private readonly IHttpContextAccessor _httpContextAccessor;
public HomeController(IHomeService service, ILogger<HomeController> logger, IHttpContextAccessor httpContextAccessor, ApplicationDbContext context)
{
_service = service;
_logger = logger;
_httpContextAccessor = httpContextAccessor;
_context = context;
CurrentUser.Configure(_httpContextAccessor);
}
#endregion
#region View
#endregion
}
HomeController
登录成功后给CurrentUser赋值的相关代码如下所示:
/// <summary>
/// 设置当前登录用户
/// </summary>
public async Task SetCurrentUser(string oid, IHttpContextAccessor httpContextAccessor, ApplicationDbContext context)
{
CurrentUser.Configure(httpContextAccessor); var user = await PSURepository.GetUserByOIDAsync(oid, context); if (user != null)
{
string role = string.Empty;
switch (user.AccountType)
{
case :
role = "Administrator";
break;
case :
role = "Instructor";
break;
case :
role = "Student";
break;
} CurrentUser.UserAccount = user.Account;
CurrentUser.UserId = user.Id;
CurrentUser.UserImage = user.ImageSrc;
CurrentUser.UserName = user.Name;
CurrentUser.UserOID = user.IdentityUserOID;
CurrentUser.UserRole = role;
CurrentUser.UserPage = user.HomePage;
}
}
SetCurrentUser
这样就可以了,当需要使用到当前登录的用户信息时,直接CurrentUser.属性就可以了,整个项目的代码还是在项目实战的那个代码仓库中,地址点后面:源代码仓储,欢迎大家提出更好的解决方案啊。最后,还是要推广下我的个人博客啊,点击这里,去看看我的博客,谢谢啦~~~
ASP.NET Core 2.0 MVC - 获取当前登录用户信息的更多相关文章
- ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现
from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...
- ASP.NET Core 2.0 MVC项目实战
一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...
- asp.net core 3.0 MVC JSON 全局配置
asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) startup配置代码如下: using System.Text.Encodings. ...
- ASP.NET Core 5.0 中读取Request中Body信息
ASP.NET Core 5.0 中读取Request中Body信息 记录一下如何读取Request中Body信息 public class ValuesController : Controller ...
- asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证
前言:最近在倒腾 微软的新平台 asp.net Core 2.0,在这个过程中有些东西还是存在差异.下面是我在学习过程的一点笔记.有不妥之处,望各位大虾指正! 一.先创建一个控制器继承于Control ...
- .net core 2.0 mvc 获取配置信息
mvc_core_config *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 ...
- spring oauth2获取当前登录用户信息。
使用spring oauth2框架做授权鉴定.想获取当前用户信息怎么办? 我们知道spring oauth2是基于spring security的实现的. spring security可以通过Sec ...
- ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作
ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择“文件” > “新建” > “项目”. 在“添加 ...
- ASP.NET Core 2.0 MVC 发布部署--------- IIS 具体操作
.Net Core 部署到 IIS系统中的步骤 一.IIS 配置 启用 Web 服务器 (IIS) 角色并建立角色服务. 1.Windows Ddesktop 桌面操作系统(win7及更高版本) 导航 ...
随机推荐
- 不用框架,原生使用python做注册接口/登陆接口/充值接口的测试,做的数据/代码分离
注意充值时候,cookie的处理方法,还是原来的三种方法 1.操作数据文件 do_exclel.py # -*- conding:utr-8 -*- #@Time :2018/11/8 22:46 ...
- Mysql之SQL经验基础积累
1.根据create_time排序,如何确保null值的排在最前面: 解决办法: ,), a.create_time DESC 结果如下图:
- npm 安装cnpm淘宝镜像时报错解决
详细报错 D:\workspace\es61> npm install -g cnpm --registry=https://registry.npm.taobao.org npm WARN d ...
- BigDecimal.valueOf
Those are two separate questions: "What should I use for BigDecimal?" and "What do I ...
- Fiddler和app抓包
1:请在“运行”,即下面这个地方输入certmgr.msc并回车,打开证书管理. 打开后,请点击操作--查找证书,如下所示: 然后输入“fiddler”查找所有相关证书,如下所示: 可以看到,我们找到 ...
- centos7部署openstack-ocata
1.前言 本文旨在记录本人的一个实验过程,因为其中有一些坑,方便以后回顾查询. 其中限于篇幅(大部分是配置部分)有些内容省略掉了,官网都有,各位如果是安装部署的话可以参考官网,不建议使用本文. 以下是 ...
- 1064 Financial Management
http://acm.hdu.edu.cn/showproblem.php?pid=1064 思路:看懂英文就很简单,就是12个数相加求平均数就ok了. 扩展: C++ 标准输入输出流的控制符 #in ...
- AppImage格式安装包使用
AppImage(以及前身klik和portablelinuxapps)不会安装传统意义上的软件(即它不会将文件放在系统中的所有位置). 它每个应用程序使用一个文件.每个都是自包含的:它包括应用程序所 ...
- Go smtp发送邮件,带附件
package main import ( "net/smtp" "bytes" "time" "io/ioutil" ...
- 使用Axis2创建一个简单的WebService服务
使用过Java进行过WebService开发都会听过或者接触过Apache Axis2,Axis2框架是应用最广泛的WebService框架之一了. 这里使用Axis2来开发和部署一个最简单的WebS ...