热线(9:00-18:00):13544706711
当前位置: 首页 > 教程技巧 > 

Asp.net Boilerplate之AbpSession扩展

时间: 2017/01/07 22:09:15

当前Abp版本1.2,项目类型为MVC5.


以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所有!


step1.添加IAbpSessionExtensions接口:



    /// 
/// IAbpSession Extensions 登录时"记住我"保存Cookie,也就是说关闭后再打开不重新登录的话,取得到值.
///

public interface IAbpSessionExtensions : IAbpSession
{
string UserName { get; }
string EmailAddress { get; }
string Name { get; }
string FullName { get; }
string Surname { get; }
}


step2.添加实现类AbpSessionExtensions:



/// 
/// IAbpSession Extensions
///

public class AbpSessionExtensions : ClaimsAbpSession, IAbpSessionExtensions
{
public AbpSessionExtensions(IMultiTenancyConfig multiTenancy) : base(multiTenancy)
{

}

public string EmailAddress => GetKeyValue(ClaimTypes.Email);
public string Surname => GetKeyValue(ClaimTypes.Surname);
public string Name => GetKeyValue(ClaimTypes.Name);
public string UserName => GetKeyValue(EnglishConsts.ClaimTypes.UserName);
public string FullName => GetKeyValue(EnglishConsts.ClaimTypes.FullName);

private string GetKeyValue(string key)
{
var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;

if (claimsPrincipal == null)
{
return null;
}

var claim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == key);
if (string.IsNullOrEmpty(claim?.Value))
{
return null;
}

return claim.Value;

}
}


step3.在Mvc控制器基类(项目名称ControllerBase)里添加AbpSession属性:



        //IAbpSession Extensions
public new IAbpSessionExtensions AbpSession { get; set; }


step4.在Account控制器的SignInAsync方法里成功登录后(AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = rememberMe }, identity),添加需要扩展的属性:



            //IAbpSession Extensions
identity.AddClaim(new Claim(ClaimTypes.Email, user.EmailAddress));
identity.AddClaim(
new Claim(ClaimTypes.Name, user.Name));
identity.AddClaim(
new Claim(ClaimTypes.Surname, user.Surname));
       //这个常量自己去定义
identity.AddClaim(
new Claim(EnglishConsts.ClaimTypes.UserName, user.UserName));
identity.AddClaim(
new Claim(EnglishConsts.ClaimTypes.FullName, user.FullName)); 


step5.这里我定义了两个自定义常量,加在了项目名称Consts常量定义文件里:



 public class EnglishConsts
{
public const string LocalizationSourceName = "English";

public class ClaimTypes
{
public const string UserName = "UserName";
public const string FullName = "FullName";
}
}


 


这样就完成了,登录或下次自动登录之后,在代码里的智能提示里就可以看到扩展的属性:



而且值也保存在了里面: