2015-07-14 15 views
12

Tôi hiện đang làm việc trên một dự án lớn cho các đại lý ô tô và tôi gặp khó khăn.Nhận dạng ASP.NET - Triển khai tùy chỉnh với nhiều nhà cung cấp

Tôi có nên sử dụng ASP.NET Identity hoặc trường cũ FormsAuthentication?

Tôi cần đăng nhập thông qua 2 nhà cung cấp. Đầu tiên, người dùng luôn ở trong cơ sở dữ liệu, nhưng chúng tôi kiểm tra xem đó có phải là người dùng LDAP hay không, nếu có, xác thực nó qua LDAP (tôi sử dụng WebService cho phương thức có phương thức Đăng nhập).

Dưới đây là phương pháp nhập của tôi:

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var userInDb = this.db.Users.FirstOrDefault(u => u.Username == model.username); 

      if (userInDb != null) 
      { 
       // USER EXISTS 
       if (userInDb.IsLdap) 
       { 
        try 
        { 
         // IS LDAP POWERED, IGNORE PASSWORD IN DB 
         using (var ws = WebServiceClient.Factory(model.GetDomain())) 
         { 
          // MAKE AUTH 
          var result = await ws.Login(model.GetUsername(), model.password); 

          if (result.Success) 
          { 
           // USER IS LEGAL 
           FormsAuthentication.SetAuthCookie(model.username, model.remember); 

           return RedirectToAction("Init"); 
          } 
          else 
          { 
           // USER IS ILLEGAL 
           ModelState.AddModelError("", "Username or password invalid."); 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         // AN ERROR OCCURED IN CREATION OF THE WebService 
         ErrorUtils.Send(ex); 

         ModelState.AddModelError("", ex.Message); 
        } 
       } 
       else 
       { 
        // USER IS DB POWERED, CHECK THE PASSWORDS 
        var currentHash = userInDb.Password; 

        var isPasswordOkay = PasswordUtils.Validate(model.password, currentHash); 
        if (isPasswordOkay) 
        { 
         // USER PASSWORD IS LEGIT 
         FormsAuthentication.SetAuthCookie(model.username, model.remember); 

         return RedirectToAction("Init"); 
        } 
        else 
        { 
         // BAD PASSWORD 
         ModelState.AddModelError("", "Username or password invalid."); 
        } 
       } 
      } 
      else 
      { 
       try 
       { 
        // USER DO NOT EXISTS IN DB 
        using (var ws = WebServiceClient.Factory(model.GetDomain())) 
        { 
         // MAKE AUTH 
         var result = await ws.Login(model.GetUsername(), model.password); 

         if (result.Success) 
         { 
          // USER IS LEGAL IN LDAP SO CREATE IT IN DB 
          var ldapUser = (AuthResponse.AuthResponseUser)result.User; 

          var name = ldapUser.DisplayName.Split(' '); 
          var user = new User() 
          { 
           Firstname = name[0], 
           Lastname = name[1], 
           ActivatedAt = DateTime.Now, 
           ModifiedAt = DateTime.Now, 
           Email = model.username, 
           IsLdap = true, 
           Username = model.username, 
           Password = "", 
           Notifications = NotificationType.All 
          }; 

          // GET THE DEALER TO ADD IT TO THE USER RIGHT NOW 
          var dealer = this.db.BaseContexts.Find(ws.Dealer.Id); 
          user.BaseContexts.Add(dealer); 
          dealer.Users.Add(user); 

          try 
          { 
           this.db.Users.Add(user); 

           this.db.Entry(user).State = System.Data.Entity.EntityState.Added; 
           this.db.Entry(dealer).State = System.Data.Entity.EntityState.Modified; 

           await this.db.SaveChangesAsync(); 

           FormsAuthentication.SetAuthCookie(model.username, model.remember); 

           return RedirectToAction("Init"); 
          } 
          catch (Exception ex) 
          { 
           ErrorUtils.Send(ex); 

           ModelState.AddModelError("", "An error occured during user creation."); 
          } 
         } 
         else 
         { 
          // USER IS ILLEGAL 
          ModelState.AddModelError("", "Username or password invalid."); 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
        // AN ERROR OCCURED IN CREATION OF THE WebService 
        ErrorUtils.Send(ex); 

        ModelState.AddModelError("", ex.Message); 
       } 
      } 
     } 

     return View(model); 
    } 

Làm thế nào tôi có thể tối ưu hóa nó hoặc thực hiện các ASP.NET nhận dạng trong việc này? Tôi đã đọc về Multi-Tenant nhưng tôi không chắc nó là gì.

Tôi đang sử dụng FormsAuth ngay bây giờ và nó hoạt động nhưng có vẻ rất hạn chế. Ví dụ, việc tạo một người dùng là khó khăn, tuy nhiên khung Identity có UserManager rất hữu ích!

Rõ ràng, tôi muốn thứ gì đó chống đạn để xác thực qua DB hoặc LDAP tùy thuộc vào thuộc tính (bool)User.IsLdap. Tôi mặc dù về việc tạo ra một lớp học nhỏ hoạt động như một "Dịch vụ Auth" nhưng tôi không thể tìm thấy một cách để cấu trúc nó và làm cho nó nhanh.

CHỈNH SỬA: Tôi biết Nhà cung cấp bên ngoài về nhận dạng nhưng không chắc liệu tôi có thể tạo của riêng mình bằng LDAP Auth hay không.

+0

Vì vậy, bạn đang yêu cầu viết cho bạn một nhà cung cấp làm việc với cả DB và LDAP? – trailmax

+0

Vâng, tôi muốn biết LÀM THẾ NÀO tôi có thể viết một nhà cung cấp thực hiện cả hai ... –

Trả lời

5

Sử dụng ASP.NET Identity là cách tốt hơn để đi vì nó sử dụng ngăn xếp OWIN thay vì dựa vào system.web. Điều này đã được thực hiện chủ yếu cho hiệu suất và tách các lý do quan tâm. Ngoài ra nó là tốt để biết rằng các phiên bản mới hơn của MVC đang đi theo cách này.

Điều bạn đang cố gắng làm là sử dụng Xác thực hỗn hợp của cả Biểu mẫu và Windows. Mặc dù có nhiều cách để thực hiện việc này, thường dễ nhất là để bật cửa sổ auth trên máy chủ web và sau đó cho phép IIS thực hiện việc nâng hạng nặng cho bạn, điều này sẽ loại bỏ nhu cầu về dịch vụ web. Nếu đó là hướng bạn muốn đi, bạn có thể muốn có một cái nhìn tại câu hỏi tương tự này sẽ giúp bạn đi đúng hướng.

Mixed authentication for OWIN

Thậm chí nếu bạn không làm điều đó giống hệt như các giải pháp được đề xuất, bạn sẽ kết thúc thực hiện middleware OWIN của riêng bạn để làm xác thực của bạn.

+0

Điều thực sự là chúng tôi hỗ trợ một số bộ điều khiển miền bằng cách sử dụng một webservice trong mỗi người trong số họ để có thể giao tiếp với tên miền địa phương. Đây là lý do tại sao tôi không thể sử dụng Windows Auth trong IIS. Ngoài ra, nếu bạn có bất kỳ hướng dẫn nào về OWIN trên Windows Server dưới dạng ngăn xếp đơn (không có IIS), vui lòng tham khảo nó. Tôi đã tìm kiếm hàng tuần! –

+0

Bạn có thể bắt đầu với [Owin.org] (http://owin.org/) và đi từ đó. Việc thực hiện chính bạn có thể sẽ khám phá là [Katana] (http://katanaproject.codeplex.com/) mặc dù những người khác được liệt kê. Katana sẽ cho phép bạn tự lưu trữ bên trong ứng dụng giao diện điều khiển của riêng bạn hoặc Dịch vụ NT, nhưng tôi sẽ không khuyên bạn làm điều đó trừ khi bạn thực sự cần nó. Tôi chưa thấy bất kỳ cài đặt máy chủ OWIN nào được khuyến nghị sử dụng cho toàn bộ quá trình sản xuất. Tôi sẽ dính vào lưu trữ các trang web của bạn bên trong IIS hoặc trong đám mây cho bây giờ.Nếu bạn đang tìm kiếm một tùy chọn để kiểm tra bằng cách kiểm tra OWINhost.exe từ Katana. –

+0

Bạn có thể vui lòng giúp tôi với câu hỏi này không: http: //stackoverflow.com/questions/39275597/how-to-give-custom-implementation-of-updateasync-method-of-asp-net-identity –

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