2015-05-14 22 views
8

Sử dụng IdentityServer3 tôi cần phải tự động đăng nhập và chuyển hướng người dùng địa phương lại cho các ứng dụng của khách hàng sau khi người dùng đã hoàn thành một quá trình đăng ký. Có một cách thanh lịch để làm điều này? Từ đào của tôi, tôi nghi ngờ không, trong trường hợp này là có một hack tôi có thể sử dụng để đạt được điều này?Tự động đăng nhập người dùng cục bộ sau khi đăng ký với IdentityServer3

tôi đã có thể đạt được điều này cho người dùng bên ngoài bằng cách sử dụng tùy chỉnh User Service, nhưng điều này sử dụng một tên đăng nhập cục bộ. Tuy nhiên, đối với người dùng địa phương họ không trong quá trình xác thực xử lý bởi các dịch vụ tài khoản cho đến khi họ đăng nhập với tên người dùng và mật khẩu. Cũng xin lưu ý rằng tôi không có quyền truy cập vào mật khẩu người dùng vì quá trình đăng ký được bao phủ bởi nhiều màn hình/lượt xem như trong trường hợp này, họ được yêu cầu xác minh email của họ như là một phần của quy trình đăng ký.

Progress:

tôi đã tìm thấy https://github.com/IdentityServer/IdentityServer3/issues/563 này nhưng chưa từng làm việc ra làm thế nào để kích hoạt chuyển hướng.

Tôi đang cố gắng để phát hành một thẻ xác thực sử dụng:

var localAuthResult = userService.AuthenticateLocalAsync(user); 
Request.GetOwinContext().Authentication.SignIn(new ClaimsIdentity(localAuthResult.Result.User.Claims, Thinktecture.IdentityServer.Core.Constants.PrimaryAuthenticationType)); 

Nhưng tốt nhất tôi có thể làm cho đến nay là chuyển hướng người dùng quay trở lại màn hình đăng nhập:

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

Trả lời

14

Thêm đăng ký liên kết đến trang đăng nhập bằng LoginPageLinks:

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

Sử dụng LoginPageLinks sẽ dẫn đến một tham số đăng nhập url sẽ được thêm vào cuối url của bạn trên trang đăng nhập. Điều này cần được bảo tồn nếu quá trình đăng ký kéo dài nhiều trang. Dễ dàng lưu trữ giá trị này trong cookie.

Bí quyết là trang đăng ký phải tồn tại dưới cùng một url với Máy chủ định danh, ví dụ: "cốt lõi". Điều này sẽ cho phép các trang của bạn chia sẻ cookie với Identity Server. Trong bộ điều khiển MVC tiêu chuẩn này có thể đạt được bằng cách sử dụng trang trí 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()); 
} 

Khi quá trình đăng ký đã được hoàn thành, bạn có thể sử dụng các phương pháp khuyến nông IssueLoginCookie để tạo ra một cookie đăng nhập. Tham số url đăng nhập sau đó có thể được sử dụng với phương thức mở rộng GetSignInMessage để truy xuất ReturnUrl để chuyển hướng phản hồi sẽ tự động đăng nhập người dùng và trả lại ứng dụng khách:

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 

... 
+0

Cảm ơn Gavin! Vì vậy, là cách duy nhất chúng tôi có thể trình bày người dùng của chúng tôi với một liên kết đăng ký thông qua trang web của chúng tôi là thông qua trang đăng nhập? – Tim

+0

@Tim - Tôi chắc chắn có những cách khác nữa, không thử nghiệm bản thân mình mặc dù. – Gavin

+0

@Gavin bạn có tìm thấy bất kỳ cách nào khác vui lòng chia sẻ – Moes

Các vấn đề liên quan