AbpSession只给了userId和TenantId,这次实际项目中并不够用,网上找了很久也没找到好的实现方法。项目初期没有时间进行研究,最近空了试了一下,大致实现添加额外字段并读取相应值的功能。

  本文以实现添加用户名字字段为例

  主要参考以下文章:

  一、基于 DDD 的. NET 开发框架 - ABP Session 实现

    该文主要介绍了ABP中关于AbpSession的源码及其实现,注:源码及其实现请参考此文,本文不做赘述

  二、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扩展实现过程的更多相关文章

  1. Asp.net Boilerplate之AbpSession扩展

    当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...

  2. ABP 初探 之 AbpSession 扩展

    Abp的权限管理是基于 Identity,所有的扩展也是基于 claims .claims 有许多默认属性,具体连接 关于 Identity的详细介绍,可以参考园友博客 继承 Microsoft.As ...

  3. 学习Xposed --记WX功能分析的过程

    首先,这个不是写个新手看的,内容比较粗略,把几个关键点自己列一下,以做记录 首先,我对andriod不懂,对java本身也不是非常熟,也从来没写过andriod或java的程序,但本着曾经对编程的理解 ...

  4. Linux fdisk命令创建扩展分区过程

    [root@localhost ~]# fdisk /dev/sdb …省略部分输出… Command (m for help): n #新建立分区 Command action e extended ...

  5. 记一次面试过程中的Python编程题

    这几天面试过程中遇到一道Python编程题,题目如下: 面试中遇到一个Python编程问题:一个字符串,将里面的数字取出来,如果第一个数字前面是+,表示整个数字为正数,如果第一个数字前面是-,表示数字 ...

  6. 记一次Debug过程

    刚刚加入新公司,就迎来第一场战斗,微服务拉入拉出测试. 简单的说,对于接入eureka 和 vi(携程开源的) 应用,在使用发布系统进行发布的时候,会经过这么一个流程   UP —— STARTING ...

  7. C#编写dll进行sql server数据库扩展储存过程

    一.编写C#函数文件 1.新建一个类库文件 备注:sqlserver 2008只能用.net3.5版本. 2.如有想加入强命名的话可如下步骤: 参考博文:https://blog.csdn.net/d ...

  8. 记一个VS连接过程中找不到cpp的解决方法

    在新增几个qt页面时,发现原来没动的几个cpp 连接报错了,错误均是qt的相关文件找不到 应该是moc文件没有生产或者没有被包含进工程.我想着既然我没动,应该不会是moc的原因,就在其他方向解决了很久 ...

  9. ABP入门系列(10)——扩展AbpSession

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发 ...

随机推荐

  1. TFS 服务端默认端口更改

    由于服务商限制8080,为了外网能访问.如果可以做映射还好.如果不能那就修改默认端口 以下为网上资源 安装完Team Foundation Server 2005 后,默认的端口是8080.如果想要事 ...

  2. Dev GridControl数据修改后实时更新数据源

      1:  /// <summary> 2:  /// 嵌入的ComboxEdit控件选择值变化事件 3:  /// </summary> 4: /// <param n ...

  3. Smali语法编程

    Smali背景: Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器.其语法是一种宽松式的Jasmin/dedexer语法,而 ...

  4. gulp插件gulp-ruby-sass和livereload插件

    gulp-ruby-sass是gulp的一个插件,主要是用来实现sass编译,livereload插件主要是实现文件保存时浏览器自动刷新,避免了手动f5的频繁的操作 准备工作:chrome浏览器安装l ...

  5. 记录视频“ Why I build Docker"

    Why we built Docker ? IT界中云计算革命正在如火如荼的进行着,docker 正在引领着这个潮流. 那么docker 是怎么引进来的呢? Docker的CTO在下面视频里如此清晰的 ...

  6. 为何jquery动态添加的input value无法提交到数据库?【坑】

    有两个输入框,我想让第一个输入框失去焦点以后,第二个输入框自动获取第一个输入框的value为默认值,jquery代码如下,可以正常显示,但是用PHP提交数据,并插入数据库的时候确实空值,尚未查找到原因 ...

  7. Java hashCode() 和 equals()的若干问题

    原文:http://www.cnblogs.com/skywang12345/p/3324958.html 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() ...

  8. java虚拟机运行时乱码问题

    问题: Android端通过socket发送文本到windows,windows调用系统剪切板进行粘贴的操作,java服务端在eclipse下直接运行粘贴的文本无乱码,打包jar后粘贴的文本乱码. 解 ...

  9. node-webkit 支持pdf浏览

    因为项目最近需要进行pdf文件的预览. 项目:linux平台下使用node-webkit开发的桌面应用. 所以在想如何解决这个问题. 首先,firefox直接可以打开pdf文件,预览效果佳,有菜单,放 ...

  10. eclipse配置javaee环境

    笔者开发javaee项目时惯用myeclipse,但由于个人笔记本性能较低,myeclipse对内存的消耗极大,所以考虑换成eclipse开发.本文介绍eclipse配置javaee开发环境的一些体会 ...