重建家园,为难新郎,离骚易烊千玺
abp提供了一个iabpsession接口,可以在不使用aspnet的session的情况下获取当前用户和租户。iabpsession还被abp中的其他结构(如设置和授权系统)完全集成和使用。
iabpsession通常是注入到所需类的属性,除非在没有会话信息的情况下无法工作。如果我们使用属性注入,我们可以使用 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属性。
abpsession定义了几个关键属性:
userid:当前用户的id,如果没有当前用户,则为null。如果调用代码被授权,则不能为空。
tenantid:当前租户的id,如果没有当前租户,则为null(如果用户没有登录或他是主机用户)。
impersonatoruserid:如果当前会话由另一个用户模拟,则模拟器用户的id。如果这不是模拟登录,则为空。
impersonatortenantid:如果当前会话由另一个用户模拟,则模拟用户的租户的id。如果这不是模拟登录,则为空。
multitenancyside:它可以是主机或租户。
userid和tenantid是可空的。还有不可空的getuserid()和gettenantid()方法。如果确定有当前用户,可以调用getuserid()。如果当前用户为空,此方法将引发异常。gettenantid()也以这种方式工作。
模拟器属性不像其他属性那么常见,通常用于审计日志记录目的。
claimsabpsession
claimsabpsession是iabpsession接口的默认实现。它从当前用户主体的声明中获取会话属性(计算的multitenancyside除外)。对于基于cookie的表单身份验证,它从cookie获取值。因此,它完全集成到asp.net的身份验证机制中。
重写当前会话值
在某些特定情况下,可能需要为有限的范围更改/覆盖会话值。在这种情况下,可以使用iabpsession。使用方法如下:
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,必须对其进行处理。一旦处理了返回值,会话值将自动恢复到以前的值。
警告!
始终在using块中使用use方法,如上所示。否则,可能会得到意想不到的session值。
用户标识符
可以使用. touseridentifier()扩展方法从iabpsession创建useridentifier对象。由于在许多api中都使用了useridentifier,这将简化为当前用户创建useridentifier对象。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
asp.net搭建博客,使用BlogEngine.NET+MySql搭建博客
网友评论