12

Tôi có một dự án mạng nội bộ được viết bằng MVC 4 sử dụng Xác thực Windows để ủy quyền và xác thực người dùng.'Đăng nhập với tư cách người dùng khác' MVC 4 Xác thực Windows

Tôi cần thêm chức năng 'Đăng nhập với tư cách người dùng khác'.

Sau khi một số tìm kiếm tôi thấy this solution điều này gợi ý trả lại một 401, và tạo ra các hành động sau đây (được gọi là sử dụng một hình thức):

// 
    // POST: /Home/LogOut 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOut() 
    { 
     return new HttpUnauthorizedResult(); 
    } 

Các hành động được gọi, và trình duyệt bật lên một tên người dùng và cửa sổ mật khẩu, tuy nhiên khi kết quả chuyển hướng trở lại Hành động, 401 luôn được trả lại.

Làm cách nào để chuyển hướng người dùng quay trở lại hành động trước đó, sau khi họ đăng nhập bằng thông tin đăng nhập mới?

Có cách nào để vô hiệu hóa thông tin xác thực ở phía máy chủ thay vì chỉ trả về 401 không?

+1

Có thể bạn nên cân nhắc chuyển đối số url trả về sang phương thức LogOut, sau đó đăng xuất người dùng và chuyển hướng đăng nhập theo cách thủ công với url trả về này? –

+0

Làm cách nào để bạn 'đăng xuất người dùng' theo cách thủ công khi sử dụng Xác thực Windows? Tất cả các giải pháp mà tôi đã tìm thấy yêu cầu một phản hồi 403 sẽ được gửi đến trình duyệt mà kết quả trong một hộp thông tin được hiển thị. – Darbio

+0

Xin lỗi, tôi đã bỏ lỡ Bạn nói về WinAuth, không phải về FormsAuth. Giải pháp duy nhất tôi tìm thấy - nhưng không được thử nghiệm - là đăng xuất thông qua javascript: http://stackoverflow.com/questions/1067263/asp-net-windows-authentication-logout (Tôi muốn chuyển url trả về tới trang đăng xuất đặc biệt) với chức năng đăng xuất javascript như trên được gọi là tải, và sau đó chuyển hướng - bằng cách sử dụng đối tượng JS.location windows.location - người dùng đến trang được xác định bởi đối số returnurl từ chuỗi truy vấn –

Trả lời

22

Mọi người reverse engineered\decompiled một số mã từ Sharepoint xảy ra để có tính năng này.

Tôi đã thử nghiệm ứng dụng ASP.NET MVC 5 và hoạt động như mong đợi.

Mã này được dựa trên decompiling Microsoft.TeamFoundation.WebAccess trong đó có các "Đăng nhập như một tài khoản khác nhau" chức năng.

public ActionResult LogOut() 
{ 
    HttpCookie cookie = Request.Cookies["TSWA-Last-User"]; 

    if(User.Identity.IsAuthenticated == false || cookie == null || StringComparer.OrdinalIgnoreCase.Equals(User.Identity.Name, cookie.Value)) 
    { 
     string name = string.Empty; 

     if(Request.IsAuthenticated) 
     { 
      name = User.Identity.Name; 
     } 

     cookie = new HttpCookie("TSWA-Last-User", name); 
     Response.Cookies.Set(cookie); 

     Response.AppendHeader("Connection", "close"); 
     Response.StatusCode = 401; // Unauthorized; 
     Response.Clear(); 
     //should probably do a redirect here to the unauthorized/failed login page 
     //if you know how to do this, please tap it on the comments below 
     Response.Write("Unauthorized. Reload the page to try again..."); 
     Response.End(); 

     return RedirectToAction("Index"); 
    } 

    cookie = new HttpCookie("TSWA-Last-User", string.Empty) 
    { 
     Expires = DateTime.Now.AddYears(-5) 
    }; 

    Response.Cookies.Set(cookie); 

    return RedirectToAction("Index"); 

} 

Nguồn:

Force Sign in as a different user while using Windows Authentication in asp.net

+1

Great find!Cảm ơn :) – Darbio

+0

Và làm thế nào để chúng tôi chuyển hướng đến một hành động khác? –

+1

Đây là lý do tại sao tôi thích internet. Số ngày vừa được lưu, ngay tại đây! – HockeyJ

0

Phương pháp này sẽ luôn đăng nhập người sử dụng ra ngoài và chuyển hướng đến trang chủ. Tôi cũng đã thêm [AllowAnonymous] để đảm bảo mọi người có thể truy cập phương pháp này.

[AllowAnonymous] 
    public ActionResult LogOut() 
    { 
     HttpCookie cookie = Request.Cookies["TSWA-Last-User"]; 

     cookie = new HttpCookie("TSWA-Last-User", string.Empty) 
     { 
      Expires = DateTime.Now.AddYears(-5) 
     }; 
     Response.Cookies.Set(cookie); 

     Response.AppendHeader("Connection", "close"); 
     Response.StatusCode = 401; // Unauthorized; 
     Response.Clear(); 

     // redirect to home 
     Response.Write("<script type='text/javascript'>"); 
     Response.Write("var getUrl = window.location; var baseUrl = getUrl.protocol + " + 
      "'//' + getUrl.host + '/' + getUrl.pathname.split('/')[1]; window.location.href = baseUrl; "); 
     Response.Write("</script>"); 
     Response.End();   

     return RedirectToAction("Index"); 

    } 
+0

sau khi thêm chức năng trên vào mã của tôi, cửa sổ xác thực cửa sổ đang đến một lần nữa và một lần nữa, ngay cả sau khi cung cấp thông tin xác thực chính xác. – Sonali

+0

Xin chào @Sonali, tôi sẽ xem xét mã trong khoảng 2 - 3 giờ và sẽ cố gắng tìm một giải pháp. –

+0

điều này xảy ra vì tôi đang cố gắng đăng nhập với cùng một người dùng một lần nữa và một lần nữa. Sau khi thử người dùng mới, nó hoạt động tốt. – Sonali