2010-02-24 61 views
4

我有一個使用Forms身份驗證的ASP.NET網站訪問ASP.NET身份驗證票證上的客戶端(通過JavaScript)

<authentication mode="Forms"> 
     <forms name="NewsCoreAuthentication" loginUrl="~/Default.aspx" defaultUrl="~/Default.aspx" protection="Validation" timeout="300" domain="someRootDomain.com" /> 
    </authentication> 

我需要確定用戶是否被網頁上證實了它被呈現到客戶端後, 。 爲了達到這個目的,我認爲我可以閱讀document.cookie並檢查是否存在「.ASPXAUTH」。 但問題是,即使我在這個值簽名是

如何檢查用戶是否已通過身份驗證? 爲什麼document.cookie是空的?


謝謝你的答案。 blowdart幫助我理解了爲什麼身份驗證票據無法從客戶端腳本訪問。

+0

@pavlo,你可以從客戶端進行檢查。有一種機制專門設計我的MS來完成客戶端腳本。它乾淨而快速,沒有磁盤活動,它只是爲你讀取cookie並返回一個布爾值。在放棄之前看到我的答案。 – 2010-03-01 17:35:24

回答

5

它是空白的原因是因爲cookie被標記爲HttpOnly。這意味着它不能通過腳本訪問。把它關掉是一個非常糟糕的主意,因爲你的網站中的XSS漏洞可能使它暴露在cookie被盜的情況下,所以我不會告訴你如何做到這一點。

+0

謝謝,你說得對。 此答案幫助了我。 我可以爲自己添加一個標誌來識別用戶是否已通過身份驗證。 – 2010-02-25 06:46:06

+1

有趣的是,沒有人提到cookie名稱應該是'NewsCoreAuthentication',而不是'.ASPXAUTH',儘管這與啓用HttpOnly標誌無關,我想。 – 2014-08-04 00:39:44

0

第一......這是一個壞主意。檢查用戶是否在客戶端獲得授權絕對沒有安全性。沒有。

但是,如果你真的想這樣做...做代碼後面的檢查,並將值推送到可以通過Javascript讀取的客戶端。類似於:

RegisterClientScript(「isvalidated」,「var isUserAuthenticated =」+ UserAuthenticated);

您現在看到問題了嗎?你可以在AJAX中做同樣的事情......但它有同樣的問題。

好吧,我可以看到這樣做是爲了簡單方便用戶...顯示某些鏈接,如果他們被授權例如。但在任何形式或形式上都不安全。只需要幫你一個忙,並在代碼隱藏中處理這個問題。

+0

一個很好的評論和建議,但我需要在客戶端進行此檢查的原因是因爲頁面僅由IIS(htm和html)處理。 AJAX是一個好主意,但由於網站的負載很高,我無法負擔調用ASP.NET頁面(或處理程序)。 檢查後,我會在IFRAME中顯示一些安全的頁面。所以cookie中的這個標誌不會導致安全問題。謝謝你的答案! – 2010-02-25 07:06:06

1

正如其他人所說,認證機票是應該的,並且應該是安全的。

執行此操作的最佳方法是使用ApplicationServices。 JSON身份驗證端點公開了IsLoggedIn,並且我注意到您對服務器負載的擔憂。對靜態端點的調用的開銷可以忽略不計。真。

所以,如果您使用MsAjax,只需啓用應用程序服務並調用Sys.Services.AuthenticationService.IsLoggedIn。

如果你想在這裏從原材料的javascript做到這一點是codez ;-)

這部分添加到您的配置文件

<system.web> 
    ------------ 
    </system.web> 
    <system.web.extensions> 
    <scripting> 
     <webServices> 
     <authenticationService enabled ="true" requireSSL="false"/> 
     </webServices> 
    </scripting> 
    </system.web.extensions> 

頁....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 

    <script type="text/javascript"> 
     function createXHR() { 
      // a memoizing XMLHttpRequest factory. 
      var xhr; 
      var factories = [ 
        function() { return new XMLHttpRequest(); }, 
        function() { return new ActiveXObject("Msxml2.XMLHTTP"); }, 
        function() { return new ActiveXObject("Msxml3.XMLHTTP"); }, 
        function() { return new ActiveXObject("Microsoft.XMLHTTP"); } ]; 
      for (var i = 0; i < factories.length; i++) { 
       try { 
        xhr = factories[i](); 
        // memoize the factory so we don't have to look for it again. 
        createXHR = factories[i]; 
        return xhr; 
       } catch (e) { } 
      } 
     } 

     function isLoggedIn() { 
      var xhr = createXHR(); 
      xhr.open("POST", "/Authentication_JSON_AppService.axd/IsLoggedIn", true); 
      xhr.onreadystatechange = function() { 
       if (this.readyState === 4) { 
        if (this.status != 200) { 
         alert(xhr.statusText); 
        } else { 
         alert("IsLoggedIn = " + xhr.responseText); 
        } 
        xhr = null; 
       } 
      }; 
      xhr.setRequestHeader("content-type", "application/json"); 
      xhr.send(null); 
     } 
    </script> 

</head> 
<body> 
    <input type="button" value="IsLoggedIn?" onclick="isLoggedIn()" /> 
</body> 
</html> 
相關問題