Мне интересно, знает ли кто-нибудь, как можно «войти» в систему пользователя после регистрации его на Identity Server 4?
В моей текущей настройке у меня есть мастер регистрации на моем веб-сайте (localhost: 44300),Во время работы мастера пользователь вводит имя пользователя, электронную почту и пароль, которые я отправляю на свой сервер IS4 (localhost: 44310), используя пост-вызов http.На сервере IS4 я создаю пользователя и затем вызываю _signManager.SignInAsync.Я также попытался вызвать HttpContext.SignInAsync.Вернувшись на мой сайт, пользователь завершит работу мастера регистрации, а затем будет отправлен на нашу панель инструментов.Проблема в том, что когда пользователя отправляют на панель инструментов, которую ему предлагается войти в систему. Я предполагаю, что это связано с тем, что клиент не получает никаких токенов / файлов cookie.
Так кто-нибудь знает, как яможет это сделать?Обратите внимание, что самым близким вопросом, который я нашел, был этот, но на него не было ответа: Identity Server 4 Автоматический вход в систему после регистрации
Пожалуйста, дайте мне знать, если что-то совершенно ясно о том, что я пытаюсьВыполните.
Спасибо за ваше время.
Запуск клиента
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "https://localhost:44310/";
options.ClientId = "Id";
options.ClientSecret = "Secret";
options.RequireHttpsMetadata = true;
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = false;
options.SignedOutRedirectUri = "https://localhost:44300/";
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("Identity");
});
Регистрация клиента
var disco = await Client.GetDiscoveryDocumentAsync("https://localhost:44310/");
if (disco.IsError)
{
throw new Exception(disco.Error);
}
var tokenResponse = await Client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "Id",
ClientSecret = "Secret",
Scope = "Identity"
});
if (tokenResponse.IsError)
{
throw new Exception(tokenResponse.Error);
}
var token = tokenResponse.AccessToken;
Client.SetBearerToken(tokenResponse.AccessToken);
var myContent = JsonConvert.SerializeObject(new {
model.Username,
model.Email,
model.Password,
Claims = new List<string> {"User"},
});
var response = await Client.PostAsync("Account/register", new StringContent(myContent, Encoding.UTF8, "application/json"));
return await response.Content.ReadAsAsync<Models.RegistrationResponse>();
Регистрация IS4
[Authorize]
[HttpPost]
public async Task<IActionResult> Register([FromBody]RegistrationRequest model)
{
user = new IdentityUser()
{
UserName = model.Username,
Email = model.Email,
};
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var cliams = new List<Claim>();
foreach (var claim in model.Claims)
{
cliams.Add(new Claim(claim, ""));
}
await _userManager.AddClaimsAsync(user, cliams);
await _signManager.SignInAsync(user, true);//I was originally just doing this
//I tried copying what Account/Login does, which is the following lines
await _events.RaiseAsync(new UserLoginSuccessEvent(user.UserName, user.Id, user.UserName));
await HttpContext.SignInAsync(user.Id, user.UserName);
////////////////////////////
return Ok(new RegistrationResponse()
{
Successful = true,
UserId = user.Id,
});
}
}