记AbpSession扩展实现过程
AbpSession只给了userId和TenantId,这次实际项目中并不够用,网上找了很久也没找到好的实现方法。项目初期没有时间进行研究,最近空了试了一下,大致实现添加额外字段并读取相应值的功能。
本文以实现添加用户名字字段为例
主要参考以下文章:
一、基于 DDD 的. NET 开发框架 - ABP Session 实现
该文主要介绍了ABP中关于AbpSession的源码及其实现,注:源码及其实现请参考此文,本文不做赘述
该文记录作者对于AbpSession扩展的尝试,似乎是在源代码上进行的修改(仅个人猜测),实现方法大致与本文相同,但本文的实现未修改源代码
三、MVC5 - ASP.NET Identity 登录原理 - Claims-based 认证和 OWIN
该文介绍并讲解了ABP使用的登陆验证组件 ASP.NET Identity
参考上述文章后大概有一个实现思路,思路如下:
1.创建一个继承自ClaimsAbpSession的类,该类中实现自己新加字段的读取
代码如下:
public class MyAbpSession : ClaimsAbpSession
{
public MyAbpSession(IMultiTenancyConfig multiTenancy) : base(multiTenancy)
{ } public virtual string UserName
{
get
{
var userIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == "UserName");
return userIdClaim.Value;
}
}
}
2.替换ABP中IAbpSession接口的实现类ClaimsAbpSession为MyAbpSession
public override void PreInitialize()
{
//Enable database based localization
Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization(); //替换IAbpSession的实现类
Configuration.ReplaceService<IAbpSession, MyAbpSession>(DependencyLifeStyle.Transient); }
3.用户登陆后往现有的Claims中插入UserName的Claim
private async Task SignInAsync(User user, ClaimsIdentity identity = null, bool rememberMe = false)
{ if (identity == null)
{
identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
}
else
{
//UserName为查询用标识(key)
identity.AddClaim(new Claim("UserName", user.Name));
}
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties {IsPersistent = rememberMe}, identity);
}
经过这些代码后,设置断点可查看到,新的session中已经存在我们需要的UserName字段并且数据已经拿到手了。

但是由于IAbpSession接口没有提供UserName字段,所以这个时候我们是没有办法在写代码的时候通过AbpSession.UserName来获取的,这样做会报错。当然你可以强制转换后强行获取,这样明显是不符合我们要求的。
于是参考了ABP的源码,ABP中有一个扩展类AbpSessionExtensions,实现了通过方法来获取UserId的值。于是我转换了一下实现思路
4.通过扩展类,以方法的方式来获取该值
该扩展实现后原MyAbpSession类已经没有用了,可以删去,本文主要从最先思路开始,所以还留着。即最终实现只需要按3、4的步骤进行,无需从一开始。
public static class MyAbpSessionExtensions
{
public static string GetUserName(this IAbpSession session)
{
//在ABP源码中也是通过DefaultPrincipalAccessor.Instance来获取PrincipalAccessor 即此处的DefaultPrincipalAccessor.Instance等价于上文中的PrincipalAccessor
var userIdClaim = DefaultPrincipalAccessor.Instance.Principal?.Claims.FirstOrDefault(c => c.Type == "UserName");
return userIdClaim.Value;
}
}
至此可以在代码中以方法的方式来获取UserName的值了

附:实在是想不出怎么以字段的方式来实现(即AbpSession.UserName),除了改ABP源码修改IAbpSession,只能求其次以方法来实现。菜鸟实力只到这里,望有大神可以解决此问题
实现过程还是走了弯路的特别是替换IAbpSession的实现类,直接接触的IOC相关才少,都不知道怎么换,不过最终还是查到了相关代码,果然还是要多百度和google。
看到ABP 入门系列(10)——扩展 AbpSession受启发
新建IMyAbpSession接口
public interface IMyAbpSession:IAbpSession
{ string UserName{ get;}
}
并使MyAbpSession继承该接口,之后再controller和 Service基类中替换原有AbpSession即可以属性方式来使用
public new IMyAbpSession AbpSession { get; set; }
ABP的求知路还很漫长啊~求基友一起啊
记AbpSession扩展实现过程的更多相关文章
- Asp.net Boilerplate之AbpSession扩展
当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...
- ABP 初探 之 AbpSession 扩展
Abp的权限管理是基于 Identity,所有的扩展也是基于 claims .claims 有许多默认属性,具体连接 关于 Identity的详细介绍,可以参考园友博客 继承 Microsoft.As ...
- 学习Xposed --记WX功能分析的过程
首先,这个不是写个新手看的,内容比较粗略,把几个关键点自己列一下,以做记录 首先,我对andriod不懂,对java本身也不是非常熟,也从来没写过andriod或java的程序,但本着曾经对编程的理解 ...
- Linux fdisk命令创建扩展分区过程
[root@localhost ~]# fdisk /dev/sdb …省略部分输出… Command (m for help): n #新建立分区 Command action e extended ...
- 记一次面试过程中的Python编程题
这几天面试过程中遇到一道Python编程题,题目如下: 面试中遇到一个Python编程问题:一个字符串,将里面的数字取出来,如果第一个数字前面是+,表示整个数字为正数,如果第一个数字前面是-,表示数字 ...
- 记一次Debug过程
刚刚加入新公司,就迎来第一场战斗,微服务拉入拉出测试. 简单的说,对于接入eureka 和 vi(携程开源的) 应用,在使用发布系统进行发布的时候,会经过这么一个流程 UP —— STARTING ...
- C#编写dll进行sql server数据库扩展储存过程
一.编写C#函数文件 1.新建一个类库文件 备注:sqlserver 2008只能用.net3.5版本. 2.如有想加入强命名的话可如下步骤: 参考博文:https://blog.csdn.net/d ...
- 记一个VS连接过程中找不到cpp的解决方法
在新增几个qt页面时,发现原来没动的几个cpp 连接报错了,错误均是qt的相关文件找不到 应该是moc文件没有生产或者没有被包含进工程.我想着既然我没动,应该不会是moc的原因,就在其他方向解决了很久 ...
- ABP入门系列(10)——扩展AbpSession
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发 ...
随机推荐
- 模糊测试(Fuzz testing)
模糊测试(fuzz testing)是一种安全测试方法,他介于完全的手工测试和完全的自动化测试之间.为什么是介于那两者之间?首先完全的手工测试即是渗透测试,测试人员可以模拟黑客恶意进入系统.查找漏洞, ...
- Mac删除.DS_Store文件
1.删除.DS_Store文件 sudo find ./ -name ".DS_Store" -depth -exec rm {} \; 2.禁止生成此文件 defaults wr ...
- Regular Expression Matching leetcode
递归方法运行时间过长.考虑使用动态规划的方法. 代码如下: bool isMatch(string s, string p) { int i,j; int m=s.size(); int n=p.si ...
- python smtplib发送邮件遇到的认证问题
python的smtplib模块主要是用来发送邮件的,使用起来比较方便. 使用程序发送邮件只需要写以下几行代码就OK了: #!/usr/bin/env python import smtplib s ...
- XE3随笔16:将字符串转换成 UTF8 编码的函数
这种转换一般用于网页地址; 我不知道 Delphi 是不是有现成的函数, 用到了就写了一个. //函数: function ToUTF8Encode(str: string): string; var ...
- webform的页面缓存
给页面添加<%@ OutputCache Duration="10" VaryByParam="*"%>标签就可以启用页面缓存. Duration表 ...
- win10下搭建QTP测试环境
安装环境win 10 64位企业版 个人学习用1..net 3.5无法安装更新问题解决:打开windows update 服务2.win10 安装中提示为了对电脑进行保护,已经阻止此应用,请与管理员联 ...
- canvas beginPath()
先举个简单的例子, var myCanvas = document.getElementById("myCanvas"); var context= myCanvas.getCon ...
- PHP的运行机制与原理(底层) [转]
说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来处理请求.文件流.错误处理等相关操作:Zend引擎(ZE)用以将源文件转换成机器语 ...
- 无法删除服务器 'old_server_name',因为该服务器用作复制过程中的发布服务器。 (Microsoft SQL Server,错误: 20582)
无法删除服务器 'old_server_name',因为该服务器用作复制过程中的发布服务器. (Microsoft SQL Server,错误: 20582) 2013-01-05 15:02 478 ...