(更新时间)2021年5月31日 商城高并发秒杀系统(.NET Core版) 15-通用用户模型绑定的封装
原创
©著作权归作者所有:来自51CTO博客作者愚公搬代码的原创作品,请联系作者获取转载授权,否则将追究法律责任
一:通用用户模型绑定的封装
/// <summary>
/// 系统用户(用于存储用户状态相关信息)
/// </summary>
public class SysUser
{
public int UserId { set; get; } // 用户Id
public string UserName { set; get; } // 用户名称
}
/// <summary>
/// 系统用户模型绑定(从头部信息获取用户信息,UserId和UserName)
/// 1、将HttpContext用户信息转换成为Sysuser
/// 2、将Sysuser绑定到action方法参数
/// </summary>
public class SysUserCookieModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
if (bindingContext.ModelType == typeof(SysUser))
{
// 1、创建用户对象
SysUser sysUser = new SysUser();
// 2、设置模型值(cookie,header)
HttpContext httpContext = bindingContext.HttpContext;
IRequestCookieCollection cookies = httpContext.Request.Cookies;
string UserId = cookies["UserId"];
string UserName = cookies["UserName"];
// 1、判断UserId是否为空
if (string.IsNullOrEmpty(UserId))
{
throw new BizException("授权失败,没有登录");
}
sysUser.UserId = Convert.ToInt32(UserId);
sysUser.UserName = UserName;
// 3、返回结果
bindingContext.Result = ModelBindingResult.Success(sysUser);
}
return Task.CompletedTask;
}
}
/// <summary>
/// 系统用户模型绑定(从头部信息获取用户信息,UserId和UserName)
/// 1、将HttpContext用户信息转换成为Sysuser
/// 2、将Sysuser绑定到action方法参数
/// </summary>
public class SysUserHeaderModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
if (bindingContext.ModelType == typeof(SysUser))
{
// 1、创建用户对象
SysUser sysUser = new SysUser();
// 2、设置模型值(cookie,header)
HttpContext httpContext = bindingContext.HttpContext;
IHeaderDictionary headers = httpContext.Request.Headers;
string UserId = headers["UserId"];
string UserName = headers["UserName"];
// 1、判断UserId是否为空
if (string.IsNullOrEmpty(UserId))
{
throw new BizException("授权失败,没有登录");
}
sysUser.UserId = Convert.ToInt32(UserId);
sysUser.UserName = UserName;
// 3、返回结果
bindingContext.Result = ModelBindingResult.Success(sysUser);
}
return Task.CompletedTask;
}
}
/// <summary>
/// 系统用户模型绑定
/// 1、将HttpContext用户信息转换成为Sysuser
/// 2、将Sysuser绑定到action方法参数
/// </summary>
public class SysUserModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
if (bindingContext.ModelType == typeof(SysUser))
{
// 1、转换到指定模型
// SysUser sysUser = (SysUser)bindingContext.Model;
SysUser sysUser = new SysUser();
// 2、设置模型值(cookie,header)
HttpContext httpContext = bindingContext.HttpContext;
ClaimsPrincipal claimsPrincipal = httpContext.User;
IEnumerable<Claim> claims = claimsPrincipal.Claims;
// 1、判断申明是否为空,如果为空,没有登录,抛出异常
if (claims.ToList().Count == 0)
{
throw new BizException("授权失败,没有登录");
}
foreach (var claim in claims)
{
// 1、获取用户Id
if (claim.Type.Equals("sub"))
{
sysUser.UserId = Convert.ToInt32(claim.Value);
}
// 2、获取用户名
if (claim.Type.Equals("amr"))
{
sysUser.UserName = claim.Value;
}
}
// 3、返回结果
bindingContext.Result = ModelBindingResult.Success(sysUser);
}
return Task.CompletedTask;
}
}
/// <summary>
/// 自定义模型绑定提供者(提供SysUserModelBinder)
/// </summary>
public class SysUserModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context.Metadata.ModelType == typeof(SysUser))
{
return new BinderTypeModelBinder(typeof(SysUserHeaderModelBinder));
}
return null;
}
}