Как проверить состояние аутентификации ASP.NET Forms, используя только JavaScript? - PullRequest
1 голос
/ 20 июля 2010

Причина, по которой мне нужно это сделать, заключается в том, что Facebook Connect - это еще одна история, поэтому я оставлю вам драму для этого.=)

Во всяком случае, у меня есть эта функция, которая работает на window.onload:

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

Итак, мне нужна помощь в получении флага "loggedInUsingFormsAuth".

Мне все равно, что в куки, просто нужно знать, аутентифицирован ли текущий пользователь.

Почему я это делаю?

Ну, при загрузке окна,если пользователь вошел в Facebook, но не на моем веб-сайте (в соответствии с файлом cookie для проверки подлинности с помощью форм), я хочу перезагрузить страницу - что позволяет моему веб-сайту ASP.NET считывать файлы cookie Facebook в HttpContext и регистрировать пользователя. IМне нужно сделать это в JavaScript, потому что у меня нет файлов cookie Facebook, пока я не позвоню «SomeFunctionWhichGetsFacebookCookies» - что можно сделать только в JavaScript.

Итак, как мне работать, если текущий пользователь аутентифицирован через JavaScript?Нужно ли мне вручную просматривать файлы cookie, находить нужный файл и проверять его?Это безопасная вещь?

Или я должен альтернативно выписать флаг клиенту с сервера, используя RegisterClientScript?

Ответы [ 4 ]

4 голосов
/ 28 июля 2010

Вы можете добавить следующее в ваш файл 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 голосов
/ 05 июня 2014

У меня есть решение, которому нужен только код в одном месте:

Добавьте приведенный ниже код в 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 доступна на каждомстр.

0 голосов
/ 21 июля 2010

Поскольку я регистрирую 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() =>

Обычно я бы не выбрал решение, подобное этому, я обычно вызывал бы асинхронный веб-сервис (как упоминает ответ Бена). Но дело в том, что это свойство и JavaScript оцениваются на основе запроса страницы, поэтому оценка этого свойства никогда не будет устаревать для каждого данного HTTP-запроса.

0 голосов
/ 20 июля 2010

Лучший способ сделать это, чем вы описали в своем комментарии, - создать простой веб-сервис, который вы вызываете для получения значения.

...