ОБНОВЛЕНИЕ
Это оказалось идеальным вариантом использования для JWT.
Вот как я решил эту проблему -
Из контроллера на firstdomain.com , при отправке пользователю ссылки на регистрацию на seconddomain.com я включаю JWT следующим образом -
// use a jwt token that can be verified on another domain
var token = jsonWebTokenService.GetEncryptedToken(new ClaimsIdentity(GetClaimsList(user.Id)), TimeSpan.FromMinutes(10));
private IList<Claim> GetClaimsList(string id)
{
return new List<Claim>() {
new Claim(ClaimTypes.Name, id),
new Claim(ClaimTypes.UserData, id),
new Claim(ClaimTypes.Role, "ROLESTRING")
};
}
Из JsonWebTokenService.cs -
public string GetEncryptedToken(ClaimsIdentity subject, TimeSpan timeSpan)
{
// setup credentials
var signingCreds = new SigningCredentials(signatureKey, SecurityAlgorithms.HmacSha256);
var encryptionCreds = new EncryptingCredentials(encryptionKey,
SecurityAlgorithms.Aes128KW, SecurityAlgorithms.Aes128CbcHmacSha256);
// claims identity for jwt creation
var handler = new JwtSecurityTokenHandler();
var utcNow = DateTime.UtcNow;
var token = handler.CreateJwtSecurityToken(jwtSettings.Issuer, jwtSettings.Issuer, subject,
utcNow, utcNow.AddMilliseconds(timeSpan.TotalMilliseconds), utcNow, signingCreds, encryptionCreds);
return handler.WriteToken(token);
}
* Примечание. Я вручную создал signatureKey и encryptionKey с помощью отдельного консольного приложения, в котором использовались безопасные / проверенные библиотеки шифрования, такие как RNGCryptoServiceProvider () и HMACSHA256. () и я надежно хранил эти значения в переменных среды на сервере для обоих доменов, а также для секретов. json для каждого проекта.
Ссылка для регистрации действительна в течение 10 минут (время жизни JWT).
Из контроллера на seconddomain.com я проверяю JWT -
var user = await userManager.FindByIdAsync(userId);
try
{
var principal = jsonWebTokenService.ProcessEncryptedToken(code);
var name = principal.FindFirstValue(ClaimTypes.Name);
var role = principal.FindFirstValue(ClaimTypes.Role);
if (name != user.Id || role != "ROLESTRING")
throw new ArgumentException("User not found.");
user.EmailConfirmed = true;
await userManager.UpdateAsync(user);
await signInManager.SignOutAsync();
return RedirectToAction("CompleteRegistration", new { userId = userId, code = code });
}
catch (Exception ex)
{
logger.LogWarning(ex, "Failed to confirm email for {UserId}", userId);
return BadRequest();
}
Снова, из JsonWebTokenService.cs, я проверяю JWT -
public ClaimsPrincipal ProcessEncryptedToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
IssuerSigningKey = signatureKey,
ValidIssuer = jwtSettings.Issuer,
ValidateAudience = true,
ValidAudience = jwtSettings.Issuer,
TokenDecryptionKey = encryptionKey,
ClockSkew = TimeSpan.Zero
};
// throws exceptions if the token is no longer valid
return tokenHandler
.ValidateToken(token, validationParameters, out SecurityToken validatedToken);
}
Когда ток ru успешно подтвержден, пользователь перенаправлен для завершения регистрации.
Надеюсь, это поможет кому-то, кто может застрять в подобной проблеме. Существует много информации о JWT, если вы проводите исследования. Но это заняло у меня несколько часов, чтобы придумать это, поскольку не было много информации об использовании JWT для проверки регистрации электронной почты. JWT часто используются для аутентификации ПОСЛЕ , когда пользователь уже ввел действительные учетные данные на сайте. Это решение предоставило нам возможность проверить регистрацию электронной почты в разных доменах в качестве альтернативы ASP. NET Core Identity UserManager.