在ASP.Net Core中获取TenantID和UserID的解决方法取决于你使用的身份验证方案。下面是使用Microsoft身份验证提供程序的解决方法,包含代码示例:
services.AddAuthentication()
.AddMicrosoftAccount(options =>
{
options.ClientId = "YourClientId";
options.ClientSecret = "YourClientSecret";
});
SignInManager和UserManager:private readonly SignInManager _signInManager;
private readonly UserManager _userManager;
public YourController(SignInManager signInManager, UserManager userManager)
{
_signInManager = signInManager;
_userManager = userManager;
}
ExternalLoginSignInAsync来处理外部登录:[HttpGet]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
var redirectUrl = Url.Action("ExternalLoginCallback", "YourController", new { ReturnUrl = returnUrl });
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return Challenge(properties, provider);
}
[HttpGet]
public async Task ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
if (remoteError != null)
{
// 处理登录错误
return RedirectToAction("Login");
}
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
// 处理登录错误
return RedirectToAction("Login");
}
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
// 登录成功
var user = await _userManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey);
var tenantId = user?.TenantId;
var userId = user?.Id;
// 处理登录成功逻辑
return RedirectToAction("Index");
}
if (result.IsLockedOut)
{
// 处理账号被锁定逻辑
return RedirectToAction("Lockout");
}
else
{
// 处理创建本地用户逻辑
var email = info.Principal.FindFirstValue(ClaimTypes.Email);
var user = new IdentityUser { UserName = email, Email = email };
var createResult = await _userManager.CreateAsync(user);
if (createResult.Succeeded)
{
await _userManager.AddLoginAsync(user, info);
await _signInManager.SignInAsync(user, isPersistent: false);
// 登录成功
var tenantId = user?.TenantId;
var userId = user?.Id;
// 处理登录成功逻辑
return RedirectToAction("Index");
}
else
{
// 处理创建用户失败逻辑
return RedirectToAction("Login");
}
}
}
在上述代码示例中,当用户使用外部登录完成后,可以通过_userManager.FindByLoginAsync方法获取用户的TenantId和Id,然后进行相应的处理。请确保在IdentityUser模型中包含了TenantId属性。
需要注意的是,上述示例仅适用于使用Microsoft账号进行外部登录的情况,如果你使用其他身份验证提供程序,你需要相应地修改代码。