|
|
|
@ -25,17 +25,21 @@ namespace CompanyName.ProjectName.Users |
|
|
|
{ |
|
|
|
private readonly IdentityUserManager _userManager; |
|
|
|
private readonly JwtOptions _jwtOptions; |
|
|
|
private readonly Microsoft.AspNetCore.Identity.SignInManager<Volo.Abp.Identity.IdentityUser> _signInManager; |
|
|
|
|
|
|
|
private readonly Microsoft.AspNetCore.Identity.SignInManager<Volo.Abp.Identity.IdentityUser> |
|
|
|
_signInManager; |
|
|
|
|
|
|
|
private readonly IHttpClientFactory _httpClientFactory; |
|
|
|
private readonly ICurrentTenant _currentTenant; |
|
|
|
private readonly IHttpContextAccessor _contextAccessor; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public AccountAppService( |
|
|
|
IdentityUserManager userManager, |
|
|
|
IOptionsSnapshot<JwtOptions> jwtOptions, |
|
|
|
Microsoft.AspNetCore.Identity.SignInManager<IdentityUser> signInManager, |
|
|
|
IHttpClientFactory httpClientFactory, ICurrentTenant currentTenant, IHttpContextAccessor contextAccessor) |
|
|
|
IHttpClientFactory httpClientFactory, ICurrentTenant currentTenant, |
|
|
|
IHttpContextAccessor contextAccessor) |
|
|
|
{ |
|
|
|
_userManager = userManager; |
|
|
|
_jwtOptions = jwtOptions.Value; |
|
|
|
@ -48,47 +52,43 @@ namespace CompanyName.ProjectName.Users |
|
|
|
|
|
|
|
public async Task<LoginOutput> LoginAsync(LoginInput input) |
|
|
|
{ |
|
|
|
try |
|
|
|
var result = |
|
|
|
await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true); |
|
|
|
if (result.IsLockedOut) |
|
|
|
{ |
|
|
|
var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true); |
|
|
|
if (result.IsLockedOut) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException("当前用户已被锁定"); |
|
|
|
} |
|
|
|
|
|
|
|
if (!result.Succeeded) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException("用户名或者密码错误"); |
|
|
|
} |
|
|
|
|
|
|
|
var s = _currentTenant.Id; |
|
|
|
var user = await _userManager.FindByNameAsync(input.Name); |
|
|
|
return await BuildResult(user); |
|
|
|
throw new UserFriendlyException("当前用户已被锁定"); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
|
|
|
|
if (!result.Succeeded) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException(ex.Message); |
|
|
|
throw new UserFriendlyException("用户名或者密码错误"); |
|
|
|
} |
|
|
|
|
|
|
|
var user = await _userManager.FindByNameAsync(input.Name); |
|
|
|
return await BuildResult(user); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public async Task<LoginOutput> StsLoginAsync(string accessToken) |
|
|
|
{ |
|
|
|
// 通过access token 获取用户信息,id4没有把角色信息带过来
|
|
|
|
Dictionary<string, string> headers = new Dictionary<string, string> {{"Authorization", $"Bearer {accessToken}"}}; |
|
|
|
var response = await _httpClientFactory.GetAsync<LoginStsOutput>(HttpClientNameConsts.Sts, "connect/userinfo", headers); |
|
|
|
// 通过access token 获取用户信息
|
|
|
|
Dictionary<string, string> headers = new Dictionary<string, string> |
|
|
|
{ { "Authorization", $"Bearer {accessToken}" } }; |
|
|
|
var response = |
|
|
|
await _httpClientFactory.GetAsync<LoginStsOutput>(HttpClientNameConsts.Sts, |
|
|
|
"connect/userinfo", headers); |
|
|
|
var user = await _userManager.FindByNameAsync(response.name); |
|
|
|
return await BuildResult(user); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task<LoginOutput> BuildResult(IdentityUser user) |
|
|
|
{ |
|
|
|
if (user.LockoutEnabled) throw new Exception("当前用户已被锁定"); |
|
|
|
if (user.LockoutEnabled) throw new UserFriendlyException("当前用户已被锁定"); |
|
|
|
var roles = await _userManager.GetRolesAsync(user); |
|
|
|
if (roles == null || roles.Count == 0) throw new Exception("当前用户未分配角色"); |
|
|
|
var token = GenerateJwt(user.Id, user.UserName, user.Name, user.Email, user.TenantId.ToString(), roles.ToList()); |
|
|
|
if (roles == null || roles.Count == 0) throw new UserFriendlyException("当前用户未分配角色"); |
|
|
|
var token = GenerateJwt(user.Id, user.UserName, user.Name, user.Email, |
|
|
|
user.TenantId.ToString(), roles.ToList()); |
|
|
|
var loginOutput = ObjectMapper.Map<IdentityUser, LoginOutput>(user); |
|
|
|
loginOutput.Token = token; |
|
|
|
loginOutput.Roles = roles.ToList(); |
|
|
|
@ -99,7 +99,8 @@ namespace CompanyName.ProjectName.Users |
|
|
|
/// 生成jwt token
|
|
|
|
/// </summary>
|
|
|
|
/// <returns></returns>
|
|
|
|
private string GenerateJwt(Guid userId, string userName, string name, string email, string tenantId, List<string> roles) |
|
|
|
private string GenerateJwt(Guid userId, string userName, string name, string email, |
|
|
|
string tenantId, List<string> roles) |
|
|
|
{ |
|
|
|
var dateNow = DateTime.Now; |
|
|
|
var expirationTime = dateNow + TimeSpan.FromHours(_jwtOptions.ExpirationTime); |
|
|
|
@ -125,7 +126,8 @@ namespace CompanyName.ProjectName.Users |
|
|
|
{ |
|
|
|
Subject = new ClaimsIdentity(claims), |
|
|
|
Expires = expirationTime, |
|
|
|
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) |
|
|
|
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), |
|
|
|
SecurityAlgorithms.HmacSha256Signature) |
|
|
|
}; |
|
|
|
var handler = new JwtSecurityTokenHandler(); |
|
|
|
var token = handler.CreateToken(tokenDescriptor); |
|
|
|
|