首页 > 解决方案 > Identity Server 4 注册用户后自动登录

问题描述

我想知道是否有人知道在向 Identity Server 4 注册用户后如何“登录”用户?

在我当前的设置中,我的网站 (localhost:44300) 上有一个注册向导。在向导期间,用户将输入我使用 http post call 发送到我的 IS4 服务器 (localhost:44310) 的用户名、电子邮件和密码。在 IS4 服务器上,我创建用户,然后调用 _signManager.SignInAsync。我也尝试过调用 HttpContext.SignInAsync。返回我的网站后,用户将完成注册向导,然后被发送到我们的仪表板。问题是当用户被发送到他们被要求登录的仪表板时。我认为这与客户端没有收到任何令牌/cookies的事实有关。

那么有谁知道我如何做到这一点?请注意,我发现的最接近的问题是这个问题,但尚未得到解答:Identity Server 4 Auto Login After Registration

如果我想要完成的事情很清楚,请告诉我。

感谢您的时间。

客户端启动

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,
        });
    }
}

标签: loginasp.net-core-mvcidentityserver4registration

解决方案


推荐阅读