(译)ABP之Abp Session
原文地址:https://aspnetboilerplate.com/Pages/Documents/Abp-Session
介绍
ABP提供IAbpSession接口获取当前用户和租户信息,而不是使用ASP.NET的Session。在ABP中,IAbpSession也被其他结构完全集成和使用。(例如设置系统和授权系统)。
注入Session
在需要用到IAbpSession的类中,通常是通过属性注入的,除非在没有Session信息时它不能运行。如果我们用属性注入,我们可以用NullAbpSession.Instance作为默认值,如下所示:
public class MyClass : ITransientDependency
{
public IAbpSession AbpSession { get; set; }
public MyClass()
{
AbpSession = NullAbpSession.Instance;
}
public void MyMethod()
{
var currentUserId = AbpSession.UserId;
//...
}
}
因为验证/授权是一个应用层任务,建议在应用层和上层模块使用IAbpSession(我们一般在领域层不用它),ApplicationService,AbpController,AbpApiController和其它一些基层类已经注入了AbpSession,因此,例如在你的应用服务方法里可以直接使用AbpSession属性。
Session属性
AbpSession定义了一些关键属性:
- UserId:当前用户的Id,或者没有当前用户时为null,如果调用了授权方法,它就不可能为null。
- TenantId:当前租户Id,或者没有当前租户时为null(如果用户没有登录或者他不是主用户)。
- ImpersonatorUserId:如果当前session是由其它用户模拟的,则是模拟用户的Id,如果没有模拟登录,就为null。
- ImpersonatorTenantId:如果当前session是由其它用户模拟的,则是模拟用户的租户Id,如果没有模拟登录,就为null。
- MultiTenancySide:它可能是Host或者Tenant。
UserId和TenantId为可空类型,同样也有非空类型的GetUserId()和GetTenantId()方法,如果你确定一定存在一个当前用户,那你就可以调用GetUserId()方法;如果当前用户为null,调用这个方法就会抛异常,GetTenantId()方法也类似。
模拟者属性与其他属性不一样,它通常是用来作审计日志用的。
ClaimsAbpSession
ClaimsAbpSession默认实现了IAbpSession接口,它从当前用户的声明中获取session属性(除了MultiTenancySide,它是计算出来的)。对于基于表格验证的cookie,它就是从cookie里获取的,因此,它很好地集成到ASP.Net的验证机制里了。
覆盖当前Session的值
在有些特定情况下,在一定作用域里,你可能需要改变或覆盖session的值。在这种情况下,你可以像下面这样使用IAbpSession.Use方法:
public class MyService
{
private readonly IAbpSession _session;
public MyService(IAbpSession session)
{
_session = session;
}
public void Test()
{
using (_session.Use(42, null))
{
var tenantId = _session.TenantId; //42
var userId = _session.UserId; //null
}
}
Use方法返回一个IDisposable对象,而且它必须释放掉,一旦返回的值是可以释放的,session的值就会自动恢复到它之前的值。
警告
应该像上面的代码一样一定要使用using块,否则,你可能取到的session值不是预期中的值。你可以嵌套Use块,它们还是如你所预期的正常运行。
User Identifier
你可以使用.ToUserIdentifier()扩展方法从IAbpSession创建一个UserIdentifier对象,因为在大部分API里有使用UserIdentifier,这将让你为当前用户创建UserIdentifier对象变得很简单。
(译)ABP之Abp Session的更多相关文章
- [译][ABP vNext]ABP CLI,v0.18版本的新模板和其他功能
ABP CLI,v0.18版本的新模板和其他功能 ABP v0.18已发布, 包含解决的70+个issue,500+次提交 网站更改 abp.io网站完全更新以突出ABP框架的目标和重要功能.文档和博 ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十六节--SignalR与ABP框架Abp.Web.SignalR及扩展
SignalR简介 SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...
- 后台工作者HangFire与ABP框架Abp.Hangfire及扩展
HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便. HangFire是什么 Hangfire是一个开源框架(.NET ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十七节--Quartz与ABP框架Abp.Quartz及扩展
ABP+AdminLTE+Bootstrap Table权限管理系统一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate- ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...
- 手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践
本文主要讲解了如何把ABP官方的在线生成解决方案运行起来,并说明了解决方案中项目间的依赖关系.然后手动实践了如何从0搭建了一个简化的解决方案.ABP官方的在线生成解决方案源码下载参考[3],手动搭 ...
- 如何用ABP框架快速完成项目(3) - 为什么要使用ABP和ABP框架简介
首先先讲为什么要使用ABP? 当然是因为使用ABP可以快速完成项目啦. 时间就是金钱, 效率就是生命嘛 有了ABP, 你就节省了写如下模块的时间: CRUD数据库基本操作 校验 异常处理 日志 权 ...
- 【ABP】ABP跨域调用API时出现的问题
public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAss ...
- ABP 数据库 -- ABP&EF中的多表、关联查询
本文介绍一下ABP中的多表查询. 1.创建实体 多表查询,在ABP或者EF中都很简单,这里我们创建一个Demo,一个学生实体.一个学校实体. 学校里面可以有很多学生,学生有一个学校. 实体如下: 学校 ...
随机推荐
- 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(一)
CCOA是驰骋又一款对外开源的软件.集成了CCFlow(流程设计器.表单设计器)CCIM与GPM(权限系统管理),能够说,CCOA集中了驰骋开源的全部产品.同一时候,CCOA本身也具有一些功能.能够帮 ...
- 学习customEvent
title: 认真学习customEvent tags: DOM date: 2017-7-22 23:20:57 --- 最近要实现一个模拟的select元素组件,所以好好看了这个自定义事件api, ...
- 二、springcloud Netflix 注册中心
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- html5笔记——<section> 标签
定义和用法 <section> 标签定义文档中的节(section.区段).比如章节.页眉.页脚或文档中的其他部分. 注意: section 不是一个专用来做容器的标签,如果仅仅是用于设置 ...
- spring boot整合redis
1.项目目录结构 2.配置文件 application.yml testName: applicationName: testRedis spring: redis: host: 192.168.20 ...
- 关于close和shutdown
我们知道TCP是全双工的,可以在接收数据的同时发送数据.假设有主机A在和主机B通信,可以认为是在两者之间存在两个管道.就像这样:A ---------> BA <--------- B 1 ...
- Android查缺补漏--Service和IntentService
Service的运行不依赖界面,即使程序被切换到后台,Service仍然能够保持正常运行.当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行. Service 分为启动状态和绑定 ...
- Android百分比布局成功导入及简单使用
最近学习第一行代码第二版这本书,里面有介绍百分比布局的使用,经过一番摸索,终于是成功导入了百分比布局 就是这样,appcompat是25.3.1,那么百分比布局percent也是25.3.1 这样便是 ...
- css3 UI元素状态伪类选择器
选择器 说明 例子/备注 E:hover 当鼠标移到元素上元素所使用的样式 :hover{}或input:[type="text"]:hover{} E:active 当元素被激活 ...
- javascript01
手敲代码01 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...