注册IdentityServer3后自动登录本地用户3



使用IdentityServer3我需要在用户完成注册过程后自动登录并将本地用户重定向到客户端应用程序。有一种优雅的方法吗?从我的挖掘中,我不怀疑,在这种情况下,我可以使用黑客来实现这一目标?

我能够使用自定义用户服务为外部用户实现这一目标,但这使用了部分登录。但是,对于本地用户,他们不在用户服务处理的身份验证过程中,直到使用用户名和密码登录。

另外,请注意,我无法访问用户密码,因为注册过程由多个屏幕/视图涵盖,就像在这种情况下一样,他们必须验证其电子邮件作为注册过程的一部分。

进度:

我找到了此https://github.com/indistityserver/indistityserver3/issues/563,但尚未确定如何触发重定向。

我正在尝试使用:

发布身份验证令牌
var localAuthResult = userService.AuthenticateLocalAsync(user);
Request.GetOwinContext().Authentication.SignIn(new ClaimsIdentity(localAuthResult.Result.User.Claims, Thinktecture.IdentityServer.Core.Constants.PrimaryAuthenticationType));

,但我能做的最好的事情是将用户重定向到登录屏幕:

HttpCookie cookie = Request.Cookies["signin"]; // Stored previously at beginning of registration process
return Redirect("~/core/login?signin=" + cookie.Value);

使用loginpagelinks添加注册链接到登录页面:

var authOptions = new Thinktecture.IdentityServer.Core.Configuration.AuthenticationOptions
{
    IdentityProviders = ConfigureIdentityProviders,
    EnableLocalLogin = true,
    EnablePostSignOutAutoRedirect = true,
    LoginPageLinks = new LoginPageLink[] { 
        new LoginPageLink{
            Text = "Register",
            Href = "Register"
        }
    }
};

使用loginPagelinks将导致登录参数添加到登录页面的URL末尾。如果注册过程涵盖多个页面,则需要保留这一点。易于将此值存储在cookie中。

cotcha是注册页必须与身份服务器相同的URL下存在,例如"核"。这将允许您的页面与身份服务器共享cookie。在标准MVC控制器中,可以使用路线装饰器来实现:

[Route("core/Register")]
[HttpGet]
[AllowAnonymous]
public ActionResult Register(string signin)
{
    Response.Cookies.Add(new HttpCookie("signin", signin)); // Preserve the signin so we can use it to automatically redirect user after registration process
    return View(new RegisterViewModel());
}

注册过程完成后,您可以使用IssueloginCookie扩展方法来创建登录cookie。然后,可以将符号URL参数与getSignInMessage扩展方法一起使用,以重定向将自动登录用户并将其返回到客户端应用程序的响应:

>
using Thinktecture.IdentityServer.Core.Extensions;
using Thinktecture.IdentityServer.Core.Models;
...
AuthenticatedLogin login = new AuthenticatedLogin()
    {   
        IdentityProvider = Thinktecture.IdentityServer.Core.Constants.BuiltInIdentityProvider,
        Subject = userId,
        Name = AuthObjects.AuthUserService.GetDisplayNameForAccount(userId)  
    };
Request.GetOwinContext().Environment.IssueLoginCookie(login);
HttpCookie cookie = Request.Cookies["signin"];
if (cookie != null)
{
    SignInMessage message = Request.GetOwinContext().Environment.GetSignInMessage(cookie.Value);
    return Redirect(message.ReturnUrl);
}
else
...

相关内容

  • 没有找到相关文章

最新更新