6

Làm cách nào để buộc người dùng xác thực lại trước khi thực hiện Hành động trong MVC?Xác thực lại người dùng trong ứng dụng MVC cho hành động

Chúng tôi đang sử dụng xác thực Windows. Có một số hành động mà chúng tôi muốn đảm bảo đang được người dùng thực hiện (và ngăn người dùng khác thực hiện các hành động đó nếu người dùng quên khóa máy trạm của họ).

Lý tưởng nhất là tôi chỉ muốn có thể viết một thuộc tính mà kéo dài Authorize:

namespace AuthTest.Controllers 
{ 
    [Authorize(Roles="MyApp")] 
    public class HomeController : Controller 
    {  
     public ActionResult Index() 
     { 
      // A regular action 
      return View(); 
     } 

     [ReAuthenticate] 
     public ActionResult CriticalAction() 
     { 
      // Do something important 
      return View(); 
     } 
    } 
} 

Dường như tôi có thể buộc người dùng phải nhập lại thông tin của họ bằng cách phong tục ReAuthenticate thuộc tính cấp một phản ứng HTTP 401 trong phương thức AuthorizeCore. Tuy nhiên, điều này yêu cầu một số thủ thuật kể từ khi Html.ActionLink gửi hai yêu cầu:

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    bool ok = base.AuthorizeCore(httpContext); 
    if (!ok) return false; 

    if (httpContext.Session["ReAuthCnt"] == null) 
    { 
     httpContext.Session["ReAuthCnt"] = 1; 
     return false; 
    } 
    else if ((int) httpContext.Session["ReAuthCnt"] < 2) 
    { 
     httpContext.Session["ReAuthCnt"] = (int)httpContext.Session["ReAuthCnt"] + 1; 
     return false; 
    } 
    else 
    { 
     httpContext.Session["ReAuthCnt"] = 0; 
     return true; 
    } 
} 

Có cách nào tốt hơn để thực hiện ủy quyền lại không?

+0

gì bạn có nghĩa là bởi reauthenticate? –

+0

Tại sao bạn muốn? Nếu người dùng được xác thực thì họ là, tốt, xác thực. Bạn có thể xem xét OAuth nếu bạn không thể duy trì xác thực. Có lẽ nếu bạn mô tả vấn đề của mình nhiều hơn một chút, chúng tôi có thể đề xuất việc cần làm. – griegs

+0

Tôi đã cập nhật câu hỏi với nhiều chi tiết hơn về kịch bản và những gì tôi đã thử. – user2813199

Trả lời

0

Nếu người dùng đang thực hiện POST, bạn có thể thêm trường tên người dùng và mật khẩu vào biểu mẫu đó và sau đó xác thực thông tin đăng nhập đối với Active Directory trong bộ điều khiển hoặc sử dụng ActionFilter không?

-2

bạn có thể nhận ý tưởng từ đây tôi đang làm vai trò cơ sở Authorization đây

[Authorize(Roles = "admin,superadmin")]//Controler Authorization 
     public class ControlController : Controller 
     { 

      [Authorize(Roles = "superadmin")]//action Authorization 
      public ActionResult youraction() 
      { 
       return View(); 
      } 
     } 
0

Nếu bạn được phép bởi các doanh nghiệp để thực sự sử dụng một hình thức để xác thực lại họ (nói cách khác có một trang họ gõ tên người dùng và mật khẩu vào) thì bạn có thể làm như sau.

ReauthorizeAttribute

// custom page where user does type user/pass 
private string revalidateLoginUrl = "/account/reauth"; 
private bool? hasReauthenticated = false; 

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    var authUrl = HttpContext.Request.Url; 
    hasReauthenticated = httpContext.Session[authUrl] as bool? 

    // could be just (hasReauthenticated) 
    // this look a bit more readable 
    return (hasReauthenticated == true); 
} 

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (filterContext == null) 
    { 
    throw new ArgumentNullException("filterContext"); 
    } 

    var isAuthorized = AuthorizeCore(filterContext.HttpContext); 

    var authUrl = filterContext.HttpContext.Request.Url; 
    filterContext.HttpContext.Session[authUrl] = false; 

    if (!isAuthorized) 
    { 
    HandleUnauthorizedRequest(filterContext); 
    } 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    // something like this 
    var fullUrl = validateLoginurl + "?returnUrl=" 
    + HttpUtility.UrlEncode(revalidaetLoginUrl); 

    filterContext.HttpContext.Response.Redirect(validateLoginUrl); 
} 

ReauthModel

public class ReauthModel 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string ReturnUrl { get; set; } 
} 

AccoountController.cs (Validate a username and password against Active Directory?)

using System.DirectoryServices.AccountManagement; 

public ActionResult Reauth(string returnUrl) 
{ 
    var model = new ReauthModel(); 
    model.ReturnUrl = returnUrl; 

    return View(model); 
} 

[ValidateAntiForgeryToken] 
public ActionResult Reauth(ReauthModel model) 
{ 
    using(PrincipalContext pc = new 
    PrincipalContext(ContextType.Domain, "YOURDOMAIN")) 
    { 
    // validate the credentials 
    bool isValid = pc.ValidateCredentials("myuser", "mypassword"); 
    if (isValid) 
    { 
     Session[model.ReturnUrl] = true; 
     return RedirectTolocal(model.ReturnUrl); 
    } 
    } 

    // not authenticated 
    return RedirectToAction("?"); 

    //or 
    model.Username = string.Empty; 
    model.Passsword = string.Empty; 

    return View(model); 
} 

Tôi nghĩ bạn có thể tưởng tượng dựa trên ReauthModel gì quan điểm sẽ trông như thế nào.

Lưu ý: điều này nên được sử dụng ngoài bất kỳ quyền sở hữu nào khác mà bạn đang sử dụng, chứ không phải thay thế. Vì người dùng đang nhập tên người dùng và mật khẩu trên một trang web, điều này cần để sử dụng SSL (ngay cả khi nó là nội bộ).

0

Tôi sẽ tiếp cận cách này theo cách khác. Nó giống như những gì bạn thực sự muốn là một độ cao ủy nhiệm tạm thời, tương tự như UAC hoặc Sudo, nhưng trên trang web của bạn. Bạn có thể muốn rằng nếu một khoảng thời gian nhất định đã trôi qua thì người dùng phải nhập lại thông tin đăng nhập của họ để truy cập các chức năng này.

Cách tiếp cận tôi sẽ thực hiện là tạo IPrincipal tùy chỉnh cho phép bạn tạm thời thêm vai trò cụ thể cho người dùng và hết hạn vai trò đó sau một khoảng thời gian. Điều này sẽ không bị ràng buộc với vai trò người dùng được gán như được lưu trữ trong cơ sở dữ liệu, ngoài việc có lẽ chỉ nói những người dùng có vai trò cụ thể có thể được nâng lên.

Bằng cách này, bạn chỉ có thể thực hiện một kiểm tra mật khẩu, thêm vai trò tạm thời vào danh sách người dùng vai trò, và sau đó là thuộc tính Authorization tiêu chuẩn sẽ cho họ vào.