纯属是想统一前端访问端口,不暴露鉴权服务地址,
当然,也可以通过公共网关访问是完全可以实现这个效果的
另一个方面,后端swagger文档引入该接口
方便前端使用nswag工具导入swagger,少写很多前端ts代码
这只是一种特别的处理
个人代码实现,各位大佬有更好的想法,欢迎留言告知,虚心求教
public class AccountAppService : BaseAppService, IAccountAppService
{
private readonly IdentityUserManager _userManager;
private readonly IHttpClientFactory _httpClientFactory;
public AccountAppService(
IdentityUserManager userManager,
IHttpClientFactory httpClientFactory)
{
_userManager = userManager;
_httpClientFactory = httpClientFactory;
}
[AllowAnonymous]
public async Task<LoginOutput> LoginAsync(LoginInput input)
{
try
{
var client = _httpClientFactory.CreateClient(HttpClientNameConsts.AuthServer);
var dic = new Dictionary<string, object>
{
{"client_id","basic-web"},
{"client_secret","1q2w3e*"},
{"grant_type","password"},
{"username",input.Name},
{"password",input.Password},
};
var dicStr = dic.Select(m => m.Key + "=" + m.Value).DefaultIfEmpty().Aggregate((m, n) => m + "&" + n);
HttpContent httpContent = new StringContent(dicStr);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
var oauthRep = await client.PostAsync("connect/token", httpContent);
var oauthStr = await oauthRep.Content.ReadAsStringAsync();
var oauthResult = default(Id4TokenOutput);
if (oauthRep.IsSuccessStatusCode)
{
if (!string.IsNullOrEmpty(oauthStr))
oauthResult = JsonConvert.DeserializeObject<Id4TokenOutput>(oauthStr);
}
else
{
if (string.IsNullOrEmpty(oauthStr))
throw new BusinessException(oauthRep.ReasonPhrase);
}
var user = await _userManager.FindByNameAsync(input.Name);
if (!user.IsActive)
{
throw new UserFriendlyException("用户已锁定");
}
return await BuildResult(user, oauthResult?.access_token);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
#region 私有方法
private async Task<LoginOutput> BuildResult(IdentityUser user, string token)
{
var roles = await _userManager.GetRolesAsync(user);
if (roles == null || roles.Count == 0) throw new UserFriendlyException("当前用户未分配角色");
var loginOutput = ObjectMapper.Map<IdentityUser, LoginOutput>(user);
loginOutput.Token = token;
loginOutput.Roles = roles.ToList();
return loginOutput;
}
#endregion
}
public class LoginInput : IValidatableObject
{
/// <summary>
/// 用户名或者邮箱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 密码
/// </summary>
public string Password { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Name.IsNullOrWhiteSpace())
{
yield return new ValidationResult("Email can not be null", new[] { "Email" });
}
if (Password.IsNullOrWhiteSpace())
{
yield return new ValidationResult("Password can not be null", new[] { "Password" });
}
}
}
public class Id4TokenOutput
{
public string access_token { get; set; }
public int expires_in { get; set; }
public string token_type { get; set; }
public string refresh_token { get; set; }
public string scope { get; set; }
}
个人代码实现,各位大佬有更好的想法,欢迎留言告知,虚心求教