FindUserFromExternalProvider(AuthenticateResult result) { var externalUser = result.Principal; // try to determine the unique id of the external user (issued by the provider) // the most common claim type for that are the sub claim and the NameIdentifier // depending on the external provider, some other claim type might be used var userIdClaim = externalUser.FindFirst(JwtClaimTypes.Subject) ?? externalUser.FindFirst(ClaimTypes.NameIdentifier) ?? throw new Exception("Unknown userid"); // remove the user id claim so we don't include it as an extra claim if/when we provision the user var claims = externalUser.Claims.ToList(); claims.Remove(userIdClaim); var provider = result.Properties.Items["scheme"]; var providerUserId = userIdClaim.Value; // find external user //var user = _users.FindByExternalProvider(provider, providerUserId); var user = await _localUserService.GetUserByExternalProvider(provider, providerUserId); return(user, provider, providerUserId, claims); }
private async Task <(Marvin.IDP.Entities.User user, string provider, string providerUserId, IEnumerable <Claim> claims)> FindUserFromExternalProvider(AuthenticateResult result) { var(provider, providerUserId, claims) = await FindFromExternalProvider(result); // find external user var user = await _localUserService.GetUserByExternalProvider(provider, providerUserId); return(user, provider, providerUserId, claims); }