如何仅使用JavaScript检查ASP.NET窗体身份验证状态?

时间:2010-07-20 04:54:06

标签: javascript asp.net cookies forms-authentication

我需要这样做的原因是因为Facebook Connect - 这是另一个故事,所以我会为你节省戏剧费用。 =)

无论如何,我有这个在window.onload上运行的函数:

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

所以,我需要帮助才能获得“loggedInUsingFormsAuth”标志。

我不关心cookie中的内容,只需要知道当前用户是否经过身份验证。

为什么我这样做?

好吧,在窗口加载时,如果用户登录到Facebook但不在我的网站上(根据表单身份验证cookie),我想重新加载页面 - 这允许我的ASP.NET网站读取Facebook的cookie HttpContext并记录用户。我需要在JavaScript中执行此操作,因为我没有Facebook Cookie,直到我调用“SomeFunctionWhichGetsFacebookCookies” - 这只能在JavaScript中完成。

那么,如果当前用户通过JavaScript进行身份验证,我该如何解决?我是否必须手动遍历cookie,找到我想要的,并检查它?这是安全的吗?

或者我应该使用RegisterClientScript从服务器写出客户端的标志吗?

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

比您在评论中描述的更好的方法是创建一个您调用以检索值的简单Web服务。

答案 2 :(得分:0)

当我在每次加载页面时通过服务器注册JavaScript时,我决定将HttpContext.Current.Request.IsAuthenticated属性设置为JavaScript本身。

换句话说,我在C#中定义了一些JavaScript:

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请求,此属性的评估永远不会过时。

答案 3 :(得分: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在每个页面都可用。