Identity Server 4 Auto Login после регистрации пользователя - PullRequest
0 голосов
/ 22 апреля 2019

Мне интересно, знает ли кто-нибудь, как можно «войти» в систему пользователя после регистрации его на 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,
        });
    }
}
...