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. JMeter - 参数化

    方法一:使用"函数助手"添加从文件中读取参数的函数 (a)__StringFromFile函数:[读取整行数据]1.新建参数文件:

  2. ORA-12514 TNS:listener does not currently know of service requested in connect descriptor

    this issue and the fix was to make sure in tnsnames.ora the SERVICE_NAME is a valid service name in ...

  3. SQL Server日期时间格式转换字符串详解 (详询请加qq:2085920154)

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  4. Sql Server 2008卸载后再次安装一直报错

    sql server 2008卸载之后再次安装一直报错问题. 第一:由于上一次的卸载不干净,可参照百度完全卸载sql server2008 的方式 1. 用WindowsInstaller删除所有与S ...

  5. Ajax Step By Step5

    第五.[表单序列化] Ajax 用的最多的地方莫过于表单操作,而传统的表单操作是通过 submit 提交将数据传 输到服务器端.如果使用 Ajax 异步处理的话,我们需要将每个表单元素逐个获取才方能提 ...

  6. fatal error: call to undefined function imagettftext

    参照:http://stackoverflow.com/questions/7290958/php-fatal-error-call-to-undefined-function-imagettftex ...

  7. pl/sql中文乱码问题解决

    最近用pl/sql连我们公司的数据库,发现表里的中文数据都是“???”,上网查了一下,发现是数据库的编码格式和pl/sql的编码格式不统一造成的. 解决方法非常简单,只要创建一个系统环境变量:NLS_ ...

  8. list对象属性排序

    Collections.sort(list, new Comparator<ScRel>() { @Override public int compare(Object o1, Objec ...

  9. [fortify] open redirect漏洞

    简介: 些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击. 场景分析 假设有一个正规网站http://ne ...

  10. python 版本升级(CentOS) 从2.6.6升级到2.7.6

    安装必须的包 yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readli ...