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.
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
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 ... –