我想在多租户应用程序中进行身份验证后重定向URL。
当用户在登录页面(URL:domain_name.com)上输入凭据并成功进行身份验证后,浏览器URL必须更改为 {tenancy_name} .domain_name.com
我使用电子邮件地址和密码获得租约名称。现在,我想将该租赁名称放入浏览器URL,以便为用户识别。
如果用户忘记将租借名称放入网址,则表示用户输入以下网址: domain_name.com
然后,在成功验证后,必须将租赁名称添加到URL,如: 的 {tenancy_name} .domain_name.com
必须重定向到信息中心页面。
以下是我的登录帖子方法:
[HttpPost]
[UnitOfWork]
public virtual async Task<ActionResult> Login(LoginViewModel loginModel, int paymentFlag, string returnUrl = "", string returnUrlHash = "")
{
try
{
var tenant = await _tenantManager.FindByTenancyNameAsync(loginModel.TenancyName);
if (tenant.IsActive == true)
{
if (tenant != null)
{
var payments = await _paymentRepository.GetAll().Where(p => p.TenantId == tenant.Id).FirstOrDefaultAsync();
if (paymentFlag == 0)
{
if (payments == null)
{
return RedirectToAction("Payment", loginModel);
}
}
}
var loginResult = await GetLoginResultAsync(loginModel.UsernameOrEmailAddress, loginModel.Password, loginModel.TenancyName);
var tenantId = loginResult.Tenant == null ? (int?)null : loginResult.Tenant.Id;
using (UnitOfWorkManager.Current.SetTenantId(tenantId))
{
if (loginResult.User.ShouldChangePasswordOnNextLogin)
{
loginResult.User.SetNewPasswordResetCode();
return RedirectToAction("ResetPassword", new
{
TenantId = SimpleStringCipher.Instance.Encrypt(tenantId == null ? null : tenantId.ToString()),
UserId = SimpleStringCipher.Instance.Encrypt(loginResult.User.Id.ToString()),
ResetCode = loginResult.User.PasswordResetCode
});
}
var signInResult = await _signInManager.SignInOrTwoFactorAsync(loginResult, loginModel.RememberMe);
if (signInResult == SignInStatus.RequiresVerification)
{
return RedirectToAction("SendSecurityCode", new
{
returnUrl = returnUrl + (returnUrlHash ?? ""),
rememberMe = loginModel.RememberMe
});
}
Debug.Assert(signInResult == SignInStatus.Success);
await UnitOfWorkManager.Current.SaveChangesAsync();
if (string.IsNullOrWhiteSpace(returnUrl))
{
returnUrl = GetAppHomeUrl();
}
if (!string.IsNullOrWhiteSpace(returnUrlHash))
{
returnUrl = returnUrl + returnUrlHash;
}
}
}
else
{
throw new UserFriendlyException(L("UserEmailIsNotConfirmedAndCanNotLogin"));
}
}
catch (UserFriendlyException ex)
{
return RedirectToAction("Login", new
{
errorMessage = ex.Message
});
}
return Json(new AjaxResponse { TargetUrl = returnUrl });
}
答案 0 :(得分:0)
我找到了一个简单的解决方案。更新 app-initializer.ts
如下:
一、添加方法
private replaceTenantPlaceholder(baseUrl: string, defaultSubDomain: string): string {
const tenancyNamePlaceHolder = '{TENANCY_NAME}';
baseUrl = baseUrl.replace(tenancyNamePlaceHolder + '.', tenancyNamePlaceHolder);
var subDomain = window.location.hostname.split(".")[0];
subDomain = subDomain.replace(`$:{window.location.port}`, "");
switch (window.location.hostname.split(".").length) {
case 1:
case 2:
//No sub-domain on current url
subDomain = defaultSubDomain;
if (subDomain.length > 0) subDomain += ".";
break;
case 3:
//Use the current url's sub-domain
subDomain += ".";
default:
}
return baseUrl.replace(tenancyNamePlaceHolder, subDomain);
}
然后更新方法getApplicationConfig
:
AppConsts.appBaseUrl = this.replaceTenantPlaceholder(response.appBaseUrl, "www");
AppConsts.remoteServiceBaseUrl = this.replaceTenantPlaceholder(response.remoteServiceBaseUrl, "");
多租户的这一部分不需要其他修改。确保更新 CoreModule 中的 Configuration.Modules.AbpWebCommon().MultiTenancy.DomainFormat
并在 appsettings.json
我的客户端应用程序需要域中的“www”,所以这就是我使用 defaultSubDomain 参数的原因。如果不需要,您可以省略它。