c# - 注册IdentityServer3后自动登录本地用户

标签 c# oauth-2.0 identityserver3 owin-security

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

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

另请注意,我无权访问用户密码,因为注册过程涉及多个屏幕/ View ,因为在这种情况下,他们需要在注册过程中验证他们的电子邮件。

进度:

我找到了这个 https://github.com/IdentityServer/IdentityServer3/issues/563但还没有弄清楚如何触发重定向。

我正在尝试使用以下方式颁发身份验证 token :

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 参数将添加到登录页面上您的 url 的末尾。如果注册过程跨越多个页面,则需要保留此信息。很容易将此值存储在 cookie 中。

一个陷阱是注册页面必须存在于与 Identity Server 相同的 url 下,例如“核”。这将允许您的页面与 Identity Server 共享 cookie。在标准 MVC Controller 中,这可以使用 Route 装饰器来实现:

[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 扩展方法一起使用,以检索 ReturnUrl 以将响应重定向到将自动登录用户并将其返回到客户端应用程序的响应:

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

...

关于c# - 注册IdentityServer3后自动登录本地用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30228359/

相关文章:

c# - 我应该在一个简单的 get 属性上测试多重?

c# - .NET 框架升级指南

ios - 用于像 Facebook 一样在墙上发帖的 Google plus API

authentication - Dotnet Core 身份验证关联失败

c# - OnControllerColliderHit 触发次数过多

java - Vert.x Oauth 2 授权服务器

java - Java 中的 Google Contacts v3 API 和 OAuth v2

ssl - IdentityServer3 的证书要求?

asp.net-identity - 如何向IdentityServer DI框架注册ApplicationUserManager?

c# - 引用 Microsoft.Build 和 System.IO.Compression 时出现 MissingMethodException