C# ASP.Net核心Microsoft外部登录-如何获取租户ID和用户ID

C# ASP.Net核心Microsoft外部登录-如何获取租户ID和用户ID,c#,asp.net,asp.net-core,identity,C#,Asp.net,Asp.net Core,Identity,我在ASP.Net内核中有一个应用程序,具有用户标识,我还使用Microsoft帐户实现了外部登录。 我需要获取登录到门户的用户的租户ID和用户ID 我正在使用这个代码 [HttpGet] [AllowAnonymous] public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null) { if

我在ASP.Net内核中有一个应用程序,具有用户标识,我还使用Microsoft帐户实现了外部登录。 我需要获取登录到门户的用户的租户ID和用户ID

我正在使用这个代码

[HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
    {
        if (remoteError != null)
        {
            ErrorMessage = $"Error from external provider: {remoteError}";
            return RedirectToAction(nameof(Login));
        }
        var info = await _signInManager.GetExternalLoginInfoAsync();
        if (info == null)
        {
            return RedirectToAction(nameof(Login));
        }

        // Sign in the user with this external login provider if the user already has a login.
        var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);

            return RedirectToLocal(returnUrl);
        }
        if (result.IsLockedOut)
        {
            return RedirectToAction(nameof(Lockout));
        }
        else
        {
            // If the user does not have an account, then ask the user to create an account.
            ViewData["ReturnUrl"] = returnUrl;
            ViewData["LoginProvider"] = info.LoginProvider;
            var email = info.Principal.FindFirstValue(ClaimTypes.Email);
            var firstName = info.Principal.FindFirstValue(ClaimTypes.GivenName);
            var lastName = info.Principal.FindFirstValue(ClaimTypes.Surname);
            var tenantId = info.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/tenantid");
            var userId= info.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier");
            return View("ExternalLogin", new ExternalLoginViewModel {
                Email = email,
                FirstName = firstName,
                LastName = lastName
            });
        }
    }
[HttpGet]
[异名]
公共异步任务ExternalLoginCallback(string returnUrl=null,string remoteError=null)
{
if(remoteError!=null)
{
ErrorMessage=$“来自外部提供程序的错误:{remoteError}”;
返回重定向到操作(名称(登录));
}
var info=await _signInManager.getexternallogininfosync();
if(info==null)
{
返回重定向到操作(名称(登录));
}
//如果用户已经登录,请使用此外部登录提供程序登录该用户。
var result=await _signInManager.externalLoginIgninaSync(info.LoginProvider,info.ProviderKey,isPersistent:false,bypassTwoFactor:true);
if(result.successed)
{
_logger.LogInformation(“用户使用{Name}提供程序登录。”,info.LoginProvider);
返回重定向到本地(returnUrl);
}
如果(结果IsLockedOut)
{
返回重定向到操作(名称(锁定));
}
其他的
{
//如果用户没有帐户,请要求用户创建帐户。
ViewData[“ReturnUrl”]=ReturnUrl;
ViewData[“LoginProvider”]=info.LoginProvider;
var email=info.Principal.FindFirstValue(ClaimTypes.email);
var firstName=info.Principal.FindFirstValue(ClaimTypes.GivenName);
var lastName=info.Principal.FindFirstValue(ClaimTypes.姓氏);
var tenantId=info.Principal.FindFirstValue(“http://schemas.microsoft.com/identity/claims/tenantid");
var userId=info.Principal.FindFirstValue(“http://schemas.microsoft.com/identity/claims/objectidentifier");
返回视图(“ExternalLogin”,新的ExternalLoginView模型{
电子邮件=电子邮件,
FirstName=FirstName,
LastName=LastName
});
}
}

但是tenantId和userId始终为空。

您可以首先跟踪info.Principal.Claims并检查其中的声明。Hi@NanYu我尝试循环主体声明foreach(info.Principal.Claims中的var c){var cType=c.Type;var cValue=c.Value;}我只得到了这5个声明,我仍然找不到租户和用户ID。你可以首先跟踪info.Principal.claims并检查其中的声明。嗨@NanYu我试图循环每个(info.Principal.claims中的var c){var cType=c.Type;var cValue=c.Value;}我只收到了这5条声明,但我仍然找不到租户和用户ID。