8

ASP.NET MVC5 hỗ trợ tuyệt vời cho các nhà cung cấp đăng nhập xã hội bên ngoài (Google, Facebook, Twitter) tích hợp với hệ thống Nhận dạng ASP.NET. Nhưng điều gì sẽ xảy ra nếu chúng ta muốn sử dụng thông tin đăng nhập bên ngoài trực tiếp mà không cần thông qua ASP.NET Identity? Sử dụng thông tin đăng nhập bên ngoài cùng với ASP.NET Identity rất đơn giản để bắt đầu, nhưng nó yêu cầu tất cả người dùng phải đăng ký với ứng dụng. Đăng nhập bên ngoài chỉ là một phương thức xác thực khác đối với người dùng ASP.NET Identity nội bộ. Trong một số trường hợp không cần cơ sở dữ liệu nội bộ đó, tốt hơn hết là loại bỏ nó và sử dụng các nhà cung cấp đăng nhập bên ngoài mà không cần ASP.NET Identity. Điều đó có thể, nhưng đòi hỏi một chút mã hóa thủ công.

Đối với các ứng dụng web phải đối mặt công khai, tôi nghĩ rằng thường nên sử dụng ASP.NET Identity vì nó không ràng buộc người dùng với một nhà cung cấp đăng nhập cụ thể. Nhưng nếu chúng tôi ổn với việc sử dụng một và chỉ một nhà cung cấp đăng nhập cụ thể cho mỗi người dùng thì có thể bỏ qua ASP.NET Identity. Đó có thể là một tổ chức phụ thuộc rất nhiều vào Google Apps để tất cả người dùng được biết là có tài khoản Google. Nó có thể là một ứng dụng sử dụng đăng nhập liên kết dựa trên SAML2 thông qua  Kentor.AuthService .

Trong bài đăng này, tôi sẽ bắt đầu với một ứng dụng ASP.NET MVC mới được tạo mà không có bất kỳ xác thực nào và làm cho nó sử dụng xác thực Google, mà không liên quan đến Nhận dạng ASP.NET. Mã hoàn chỉnh có sẵn trên tài khoản GitHub của tôi  .

Tạo dự án


Đầu tiên, tôi đã tạo một ASP.NET MVC 5.2.0 bình thường bằng Visual Studio 2013. Mặc định là cho phép các tài khoản người dùng cá nhân, do đó phải thay đổi thành không sử dụng xác thực.

Chạy dự án đã tạo cung cấp mẫu ASP.NET MVC mặc định, không có dấu vết của bất kỳ liên kết đăng nhập hoặc bất cứ điều gì. Chính xác như chúng ta muốn. Bước tiếp theo là thêm một tài nguyên yêu cầu xác thực và xem nó thất bại như thế nào khi không có cách nào để đăng nhập.

Thêm một trang bảo mật

Để kiểm tra đăng nhập, phải có một số trang yêu cầu xác thực. Tôi đã tạo ra một Securehành động đơn giản  trong  HomeController.

[Authorize]
public ActionResult Secure()
{
  ViewBag.Message = "Secure page.";
  return View();
}

Chạy ứng dụng và cố gắng truy cập / Trang chủ / Bảo mật sẽ cung cấp trang lỗi không xác định tiêu chuẩn 401.1, đó chính xác là những gì được mong đợi.

Thêm phần mềm trung gian cookie

Mô hình xác thực Owin phân biệt giữa phần mềm trung gian đăng nhập và phần mềm trung gian xử lý phiên. Để sử dụng thông tin đăng nhập Google, trước tiên chúng tôi cần thiết lập một phần mềm trung gian cookie sẽ đặt và giữ một cookie với danh tính sau khi chúng tôi đăng nhập. Trước tiên, cần thêm một số gói nuget.

  • Microsoft.Owin.Security.Cookies cho phần mềm trung gian cookie.
  • Microsoft.Owin.Security.Google để xác thực Google.
  • Microsoft.Owin.Host.SystemWeb để chạy đường ống Owin trên IIS.

Phần mềm trung gian cookie được thiết lập thông qua một  Startup.Auth.cs tập tin. Tôi đang tuân theo các quy ước từ mẫu ASP.NET MVC cho các dự án mới với tài khoản người dùng cá nhân. Các tập tin không phải được đặt tên đó, nhưng tôi nghĩ rằng nó làm cho nó dễ dàng hơn để tìm thấy.

public partial class Startup
{
  private void ConfigureAuth(IAppBuilder app)
  {
    var cookieOptions = new CookieAuthenticationOptions
      {
        LoginPath = new PathString("/Account/Login")
      };

    app.UseCookieAuthentication(cookieOptions);
  }
}

Phần mềm trung gian xác thực cookie vừa chịu trách nhiệm duy trì danh tính qua các cuộc gọi và chuyển hướng mọi yêu cầu chưa được xác thực sang các trang bảo mật đến trang đăng nhập. Chúng tôi sẽ thực hiện theo quy ước và đặt tên cho nó / Tài khoản / Đăng nhập.

Để có được  ConfigureAuth phương pháp gọi là một số hệ thống ống nước được thực hiện trong một  Startup.cs tập tin.

[assembly: OwinStartupAttribute(typeof(SocialLoginWithoutIdentity.Startup))]

namespace SocialLoginWithoutIdentity
{
  public partial class Startup
  {
    public void Configuration(IAppBuilder app)
    {
      ConfigureAuth(app);
    }
  }
}

Với các tệp được thêm vào, chạy ứng dụng và nhấp vào liên kết Bảo mật sẽ đưa ra lỗi 404 không tìm thấy trên / Tài khoản / Đăng nhập /. Chúng ta cần có một hành động tại vị trí đó có thể bắt đầu chuỗi đăng nhập.

Thêm đăng nhập Google

Đăng nhập được bắt đầu từ vị trí / Tài khoản / Đăng nhập, bằng cách tạo một  ChallengeResult. Các ChallengeResult lớp là một phiên bản đơn giản của một từ mẫu chuẩn.

public ActionResult Login(string returnUrl)
{
  // Request a redirect to the external login provider
  return new ChallengeResult("Google",
    Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}

// Implementation copied from a standard MVC Project, with some stuff
// that relates to linking a new external login to an existing identity
// account removed.
private class ChallengeResult : HttpUnauthorizedResult
{
  public ChallengeResult(string provider, string redirectUri)
  {
    LoginProvider = provider;
    RedirectUri = redirectUri;
  }

  public string LoginProvider { get; set; }
  public string RedirectUri { get; set; }

  public override void ExecuteResult(ControllerContext context)
  {
    var properties = new AuthenticationProperties() { RedirectUri = RedirectUri };
    context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
  }
}

Nhà cung cấp đăng nhập Google cần được cấu hình trong  Startup.Auth.cs. Các  ClientId và  ClientSecretcó sẵn bằng cách đăng ký ứng dụng trên  Google phát triển console . Hãy nhớ cũng kích hoạt API Google+  cho ứng dụng hoặc phần mềm trung gian của Google sẽ không hoạt động (Tôi đã mất vài giờ để gỡ lỗi trước khi phát hiện ra đó là vấn đề rắc rối).

app.SetDefaultSignInAsAuthenticationType(cookieOptions.AuthenticationType);

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
  {
    ClientId = GoogleClientId,
    ClientSecret = GoogleClientSecret
  });

Cuộc gọi  UseGoogleAuthentication nên khá rõ ràng tại sao nó cần thiết. Nhưng điều đầu tiên SetDefaultSignInAsAuthenticationType là không rõ ràng. Nhìn vào đường dẫn xác thực bên ngoài của owin,   một phần mềm trung gian đăng nhập xã hội thường dựa vào phần mềm trung gian cookie bên ngoài được đăng ký trước phần mềm trung gian đăng nhập xã hội. Trong quá trình thiết lập phần mềm trung gian cookie bên ngoài, nó tự đặt mình là loại đăng nhập mặc định. Đó là cách phần mềm trung gian đăng nhập xã hội biết rằng nó nên sử dụng cookie bên ngoài. Trong thiết lập này không có cookie bên ngoài, vì vậy chúng tôi phải đặt thủ công phần mềm trung gian cookie chính làm loại đăng nhập mặc định. Phần mềm trung gian cookie sẽ chỉ phát hành cookie nếu  AuthenticationType phù hợp với phần trong danh tính được tạo bởi phần mềm trung gian đăng nhập xã hội.

Cần thêm một đoạn mã. Trong  Login hành động có tham chiếu đến một  ExternalLoginCallbackhành động được gọi sau khi đăng nhập bên ngoài được thực hiện. Trong triển khai mặc định trong mẫu, ExternalLoginCallback tìm kiếm tài khoản ASP.NET Identity phù hợp và đăng nhập vào đó. Nhưng trong trường hợp này mọi thứ đã được thực hiện. Đăng nhập bên ngoài đã hoàn tất và cookie đã được cấp. Các ExternalLoginCallback chỉ cần chuyển hướng người dùng quay trở lại vị trí an toàn đã làm hiển thị tên đăng nhập ở nơi đầu tiên.

public ActionResult ExternalLoginCallback(string returnUrl)
{
  return new RedirectResult(returnUrl);
}

Thông tin được trả về bởi Google

Khi sử dụng ASP.NET Identity, thông tin được Google trả về hầu hết bị bỏ qua. Khi sử dụng thiết lập này, tất cả thông tin đó đều có sẵn dưới dạng khiếu nại về danh tính hiện tại. Trong ứng dụng ví dụ, tôi đã liệt kê tất cả các khiếu nại có sẵn. Đó là một định danh tên là một định danh người dùng duy nhất cho Người dùng Google cho ứng dụng này. Một ứng dụng khác sử dụng Google SignIn sẽ nhận được một mã định danh khác. Sau đó, có tên đầy đủ, tên và họ, địa chỉ email và cuối cùng là URL hồ sơ Google cộng của tôi. Đó là tất cả thông tin cần thiết về người dùng trong nhiều ứng dụng. Tên và e-mail là hữu ích. Việc có một định danh tên duy nhất giúp lưu dữ liệu người dùng với tư cách là id và truy xuất nó sau này.

Miễn là có thể khóa người dùng vào nhà cung cấp nhận dạng đã được sử dụng khi đăng ký, không cần ASP.NET Identity trong các ứng dụng đơn giản.

|