Cách triển khai xác thực tùy chỉnh trong ASP.NET MVC 5


80

Tôi đang phát triển một ứng dụng ASP.NET MVC 5. Tôi có một DB hiện có, từ đó tôi đã tạo Mô hình Dữ liệu Thực thể ADO.NET của mình. Tôi có một bảng trong DB đó chứa cột "tên người dùng" và "mật khẩu" và tôi muốn sử dụng chúng để triển khai xác thực và ủy quyền trong Ứng dụng web của mình; Tôi không thể tạo bất kỳ cơ sở dữ liệu hoặc bảng hoặc cột nào khác và tôi không thể sử dụng xác thực Danh tính chuẩn do yêu cầu của khách hàng. Tôi không cần quản lý đăng ký, thay đổi mật khẩu hoặc những thứ khác: chỉ cần đăng nhập bằng mật khẩu và tên người dùng. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


158

Có, bạn có thể. Các bộ phận Xác thực và Ủy quyền hoạt động độc lập. Nếu bạn có dịch vụ xác thực của riêng mình, bạn chỉ có thể sử dụng phần ủy quyền của OWIN. Hãy xem xét bạn đã có một UserManagerxác thực usernamepassword. Do đó, bạn có thể viết mã sau trong hành động đăng nhập lại bài đăng của mình:

[HttpPost]
public ActionResult Login(string username, string password)
{
    if (new UserManager().IsValid(username, password))
    {
        var ident = new ClaimsIdentity(
          new[] { 
              // adding following 2 claim just for supporting default antiforgery provider
              new Claim(ClaimTypes.NameIdentifier, username),
              new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),

              new Claim(ClaimTypes.Name,username),

              // optionally you could add roles if any
              new Claim(ClaimTypes.Role, "RoleName"),
              new Claim(ClaimTypes.Role, "AnotherRole"),

          },
          DefaultAuthenticationTypes.ApplicationCookie);

        HttpContext.GetOwinContext().Authentication.SignIn(
           new AuthenticationProperties { IsPersistent = false }, ident);
        return RedirectToAction("MyAction"); // auth succeed 
    }
    // invalid username or password
    ModelState.AddModelError("", "invalid username or password");
    return View();
}

Và trình quản lý người dùng của bạn có thể giống như sau:

class UserManager
{
    public bool IsValid(string username, string password)
    {
         using(var db=new MyDbContext()) // use your DbConext
         {
             // for the sake of simplicity I use plain text passwords
             // in real world hashing and salting techniques must be implemented   
             return db.Users.Any(u=>u.Username==username 
                 && u.Password==password); 
         }
    }
}

Cuối cùng, bạn có thể bảo vệ các hành động hoặc bộ điều khiển của mình bằng cách thêm một Authorizethuộc tính.

[Authorize]
public ActionResult MySecretAction()
{
    // all authorized users can use this method
    // we have accessed current user principal by calling also
    // HttpContext.User
}

[Authorize(Roles="Admin")]
public ActionResult MySecretAction()
{
    // just Admin users have access to this method
} 

7
Tôi vừa cập nhật bài đăng của tôi để trả lời câu hỏi của bạn.
Sam FarajpourGhamari

5
Này, tôi muốn cho bạn biết rằng ví dụ github của bạn (cho tokenauth) đã giải quyết được vấn đề của tôi, cảm ơn rất nhiều! Tôi sẽ ủng hộ ví dụ của bạn 1000 lần nếu tôi có thể :)
SAU

6
gói nuget cần thiết: - Microsoft.AspNet.Identity.Core - Microsoft.AspNet.Identity.Owin - Microsoft.Owin - Microsoft.Owin.Host.SystemWeb - Microsoft.Owin.Security - Microsoft.Owin.Security.Cookies - Microsoft.Owin .Security.OAuth - Owin
Matthieu

5
Tôi ước bạn có tiền thưởng mở cho câu hỏi này để chúng tôi có thể tặng bạn +1000. Hãy đăng điều này ở đâu đó trên blog để các công cụ tìm kiếm có thể tiếp cận điều này. Đó là giải pháp dễ dàng và thanh lịch. Tôi đã dành hai ngày để đọc về OWIN và OAuth2 cung cấp và tôi không thể kết nối dây.
qua

2
@SamFarajpourGhamari: Bạn có thể giải thích tại sao chuỗi const dài đó lại được yêu cầu trong Loginmã không? ... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")Tôi đã kiểm tra rằng mã hoạt động tốt mà không có nó!
S.Serpooshan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.