2010-07-20 29 views
1

我需要這樣做的原因是因爲Facebook的連接 - 這是另一個故事,所以我會爲你節省戲劇。 =)如何檢查ASP.NET表單身份驗證狀態只使用JavaScript?

不管怎麼說,我有這個功能上的window.onload運行:

function userAuth() { 
    SomeFunctionWhichGetsFacebookCookes(); 
    if (!loggedInUsingFormsAuth && loggedInViaFacebook) { 
    window.location.reload(); // refresh page, so i can perform auto-login 
    } 
} 

所以,我需要得到標誌 「loggedInUsingFormsAuth」 的幫助。

我不在乎cookie中的內容,只需要知道當前用戶是否已通過身份驗證。

爲什麼我這樣做?

那麼,在窗口加載時,如果用戶登錄Facebook但不在我的網站上(根據Forms Authentication cookie),我想重新加載頁面 - 這允許我的ASP.NET網站讀取Facebook cookie在HttpContext中並將用戶登錄。我需要在JavaScript中執行此操作,因爲在我調用「SomeFunctionWhichGetsFacebookCookies」之前,我沒有Facebook cookie,只能在JavaScript中完成。

那麼,我該如何解決,如果當前用戶通過JavaScript驗證?我是否必須手動遍歷餅乾,找到我想要的餅乾並檢查它?這是一件安全的事情嗎?

或者我應該使用RegisterClientScript從服務器上向客戶端寫出標誌嗎?

+0

結束註冊HttpContext.Current.Request.IsAuthenticated屬性到客戶端以供JavaScript使用。更輕鬆。 – RPM1984 2010-07-20 05:32:15

回答

0

當我通過服務器註冊每個頁面加載的JavaScript時,我決定將HttpContext.Current.Request.IsAuthenticated屬性設置爲JavaScript本身。

換句話說,我有一些JavaScript代碼在C#本身定義:

public class SomeClassWhichHasAccessToHttpContext 
{ 
    private const string MyScript = "var foo='{0}'"; 

    public static string GetMyScript() 
    { 
     return string.Format(MyScript, HttpContext.Current.Request.IsAuthenticated); 
    } 
} 

然後在HTML中我的主要母版頁:

<%= SomeClassWhichHasAcccessToHttpContext.GetMyScript() => 

通常我不會選擇類似的解決方案這個,我通常會調用一個異步的Web服務(就像Ben的回答所提到的那樣)。但事實是,該屬性和JavaScript是基於頁面請求進行評估的,因此對於每個給定的HTTP請求,此屬性的評估永遠不會過時。

0

更好的方式來做到這一點比你所描述的客棧你的評論是創建一個簡單的Web服務,你打電話來檢索值。

+0

然後生病需要額外的電話到服務器,我不想要。我將Page_PreRender上的javascript呈現出來,現在我只是用來自服務器的值來呈現它。 – RPM1984 2010-07-20 10:14:12

+0

對服務器的調用是實時的,檢查一個javascript變量會告訴你用戶在他們的會話已經過期時已經登錄了。 – 2010-07-20 10:42:30

+0

從理論上講,你是正確的 - 但實際上即時通過頁面加載註冊javascript,然後立即在同一個javascript中檢查cookie - 換句話說,實時(頁面加載,檢查認證,在javascript中設置認證,javascript立即運行並檢查身份驗證)。無論如何感謝您的答案。 – RPM1984 2010-07-20 11:58:49

4

您可以將以下內容添加到您的web.config文件中。

<system.web.extensions> 
    <scripting> 
    <webServices> 
     <!-- Allows for ajax.net user authentication --> 
     <authenticationService enabled="true" requireSSL="false" /> 
    </webServices> 
    </scripting> 
</system.web.extensions> 

,然後你可以通過javascript來看看您是否被認證 像這樣。

function isAuth() { 
    var result = Sys.Services.AuthenticationService.get_isLoggedIn(); 
    return result; 
} 
+0

有趣,但它仍然在幕後調用服務器。 – RPM1984 2010-07-28 04:04:38

0

我有一個解決方案,只需要在一個地方代碼:

添加的代碼下面的global.asax.cs

protected void Application_EndRequest(object sender, EventArgs e) 
    {   
     try 
     { 
      System.Web.UI.Page P = (System.Web.UI.Page)HttpContext.Current.Handler;//will throw error if request is not for a page 
      if (P.IsCallback) { return; } 
      if (P.IsPostBack) 
      { 
       try 
       { 
        //if using AjaxControlToolKit and UpdatePanels 
        if (AjaxControlToolkit.ToolkitScriptManager.GetCurrent(P).IsInAsyncPostBack) 
        { 
         //Async postback caused by update panel   
         return; 
        } 
       } 
       catch (Exception) 
       { 
        //will throw error if no scriptmanager- which doesn't matter 
       } 
      } 
      //skip this part if not using AjaxControlToolkit or if you have it set up to get scripts from a web handler: http://blogs.msdn.com/b/delay/archive/2007/06/20/script-combining-made-better-overview-of-improvements-to-the-ajax-control-toolkit-s-toolkitscriptmanager.aspx     
      foreach (string key in P.Request.QueryString) 
      { 
       //request is from AjaxControlToolkit to get scripts. Don't want to mess with the response for this 
       if (key.ToLower().Contains("TSM")) 
       { 
        if(P.Request.QueryString[key].ToLower().Contains("toolkitscriptmanager")) 
        return; 
       } 
      } 
      //dont want to inject this when a page is outputting a file 
      if (Response.ContentType != "text/html") { return; } 

      //still going: request is for a page and its a first load or a full page postback 
      Response.Write(" <script> try{ window.UserLoggedIn=" + HttpContext.Current.User.Identity.IsAuthenticated.ToString().ToLower()+ ";} catch(ex){} </script> "); 
     } 
     catch (Exception) 
     { 

     } 
    } 

現在客戶端的可變UserLoggedIn可在每頁。

相關問題