需求是Asp.net core abp 无密码登录
具体是另外一个系统跳转到我这个系统需要做一个无密码登录,免登录的效果。 但它那个是java系统,授权也不一样,无法共用验证。
所以我在本系统增加了同步用户功能,把那边账户同步过来,租户信息也同步过来。
java系统传租户Id和用户的登录名过来,我这通过验证,返回token,以下是核心代码,就是改造了一下Authenticate。
TokenAuthController.cs文件
[HttpPost]
public async Task<AuthenticateResultModel> Authenticate([FromBody] AuthenticateModel model)
{
string errMsg = "";
// pm login
if (!string.IsNullOrEmpty(model.ProjectId))
{
_currentTenant = _tenantManager.GetTenantByPoId(model.ProjectId);
if (_currentTenant == null)
{
errMsg = $"Project Id为{model.ProjectId} 的项目没有开通租户";
Logger.Info(errMsg);
throw new UserFriendlyException(errMsg);
}
// 给全局的租户赋值,不然没法访问数据库
_unitOfWorkManager.Current.SetTenantId(_currentTenant.Id);
// user code 500Dxxxx
var user = await _userManager.FindByNameOrEmailAsync(model.UserNameOrEmailAddress);
if(user == null)
{
errMsg = $"无效的用户名: {user.Name}";
throw new UserFriendlyException(errMsg);
}
var claim = await _signInManager.CreateUserPrincipalAsync(user);
var identity = new ClaimsIdentity(claim.Claims);
var accessToken = CreateAccessToken(CreateJwtClaims(identity));
return new AuthenticateResultModel
{
AccessToken = accessToken,
EncryptedAccessToken = GetEncryptedAccessToken(accessToken),
ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds,
UserId = user.Id
};
}
else
{
var loginResult = await GetLoginResultAsync(
model.UserNameOrEmailAddress,
model.Password,
GetTenancyNameOrNull()
);
var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
return new AuthenticateResultModel
{
AccessToken = accessToken,
EncryptedAccessToken = GetEncryptedAccessToken(accessToken),
ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds,
UserId = loginResult.User.Id
};
}
}