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. solr 中文分词 IKAnalyzer

    solr中文分词器ik, 推荐资料:http://iamyida.iteye.com/blog/2220474?utm_source=tuicool&utm_medium=referral 使 ...

  2. zTree树的模糊搜索

    工作需要,所以做了一个比较方便的搜索功能:1.功能实现都是基于zTree的API:2.如有更好的建议,欢迎拍我:其中要说明下的是flag 这个字段, 这是我自己定义的扩展字段,代码中涉及到flag 请 ...

  3. 1.1使用内置的Camara应用程序捕捉图像

    一: Camara应用程序包含的意图过滤器 <intent-filter> <action android:name="android.media.action.IMAGE ...

  4. Caffe入门与应用 by GX

    深度学习几大工具:Theano(基于python),Torch,Caffe(用c++写的),Tensor flow,CNTK:caffe是比较流行的深度学习的框架 caffe特点:特别适合于新手,由于 ...

  5. Httpoxy远程代理感染漏洞 [转]

    Httpoxy是一个最新曝出的一个CGI程序漏洞,它主要可能威胁到运行在CGI上的PHP,Go,Python和其他代码程序语言. 0×01  什么是httpoxy? 具体来说, httpoxy是一组影 ...

  6. git conifg

    1. git config简介 我们知道config是配置的意思,那么git config命令就是对git进行一些配置.而配置一般都是写在配置文件里面,那么git的配置文件在哪里呢?互动一下,先问下大 ...

  7. SQL 重置自增列的值 批量处理

    Declare @IdentityTable sysname, @IdentityColumn sysname, @TotalRows int, @i int, @Iden int, @Sql var ...

  8. php嵌套数组递归搜索返回数组key

    var rewardTypes={"experience":{"\u7ecf\u9a8c\u503c":{"1":"\u660e\ ...

  9. 在rails中 Rendering Partials through Ajax

    之前做.net的时候,自己做了一个showcontent的插件,用来加载页面的局部partial 之前采用的是ashx的方式 但rails里面不太方面,今天找到一个比较好的方法,试验成功 起初网上找到 ...

  10. JavaScript-永远点不到的小窗口

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...