using IdentityModel;
using IdentityServer4.Extensions;
using IdentityServer4.Models;
using IdentityServer4.Services;
using Long.Common.Basedata;
using Long.Common.Enums;
using Long.DAO.Basedata;
using System.Security.Claims;
namespace Auth
{
public class DefaultProfileService : IProfileService
{
private readonly ISystemUserDatabase _systemUserDatabase = new SystemUserDatabase();
private readonly IUserDatabase _userDatabase = new UserDatabase();
///
/// 只要有关用户的身份信息单元被请求(例如在令牌创建期间或通过用户信息终点),就会调用此方法
///
///
///
public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var subject = context.Subject;
if (subject == null)
{
throw new ArgumentNullException(nameof(context.Subject));
}
var subjectId = subject.GetSubjectId();
if (context.Client.ClientId == UserTypeEnum.Admin.ToString().ToLower())
{
// 系统用户登录
var systemUser = await _systemUserDatabase.GetFirstAsync(long.Parse(subjectId));
if (systemUser == null)
{
throw new ArgumentException("Invalid subject identifier");
}
var claims = GetClaimsFromUser(systemUser);
context.IssuedClaims.AddRange(claims);
}
else if (context.Client.ClientId == UserTypeEnum.User.ToString().ToLower())
{
// 系统用户登录
var user = await _userDatabase.GetFirstAsync(long.Parse(subjectId));
if (user == null)
{
throw new ArgumentException("Invalid subject identifier");
}
var claims = GetClaimsFromUser(user);
context.IssuedClaims.AddRange(claims);
}
}
///
/// 验证用户是否有效 例如:token创建或者验证
///
///
///
public virtual async Task IsActiveAsync(IsActiveContext context)
{
if (context.Client.ClientId == UserTypeEnum.Admin.ToString().ToLower())
{
var user = await _systemUserDatabase.GetFirstAsync(long.Parse(context.Subject.GetSubjectId()));
context.IsActive = user?.Opened == true;
}
else if (context.Client.ClientId == UserTypeEnum.User.ToString().ToLower())
{
var user = await _userDatabase.GetFirstAsync(long.Parse(context.Subject.GetSubjectId()));
context.IsActive = user?.Opened == true;
}
}
///
/// 获取声明列表
///
///
///
private IEnumerable GetClaimsFromUser(SystemUser user)
{
var claims = new List
{
new Claim(JwtClaimTypes.Id, user.Id.ToString()),
new Claim("UserName", user.UserName)
};
return claims;
}
///
/// 获取声明列表
///
///
///
private IEnumerable GetClaimsFromUser(User user)
{
var claims = new List
{
new Claim(JwtClaimTypes.Id, user.Id.ToString()),
new Claim("UserName", user.UserName)
};
return claims;
}
}
}