using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using YD_XinWei.Commons.Exceptions;
namespace YD_XinWei.Commons.Users
{
///
/// 系统用户模型绑定
/// 1、将HttpContext用户信息转换成为Sysuser
/// 2、将Sysuser绑定到action方法参数
///
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、设置模型值
HttpContext httpContext = bindingContext.HttpContext;
ClaimsPrincipal claimsPrincipal = httpContext.User;
IEnumerable claims = claimsPrincipal.Claims;
// 1、判断申明是否为空,如果为空,没有登录,抛出异常
if (claims.ToList().Count == 0)
{
throw new BizException("授权失败,没有登录");
}
foreach (var claim in claims)
{
//// 1、获取用户Id
//if (claim.Type.Equals("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"))
//{
// sysUser.UserId = Convert.ToInt32(claim.Value);
//}
//// 2、获取用户名
//if (claim.Type.Equals("http://schemas.microsoft.com/claims/authnmethodsreferences"))
//{
// sysUser.UserName = claim.Value;
//}
// 1、获取用户Id
if (claim.Type.Equals(JwtRegisteredClaimNames.Sub))
{
sysUser.UserId = Convert.ToInt32(claim.Value);
}
// 2、获取用户名
if (claim.Type.Equals(JwtRegisteredClaimNames.UniqueName))
{
sysUser.UserName = claim.Value;
}
}
// 3、返回结果
bindingContext.Result = ModelBindingResult.Success(sysUser);
}
return Task.CompletedTask;
}
}
}