Почему Request.IsAuthenticated является ложным - PullRequest
4 голосов
/ 02 марта 2012

У меня есть следующий скрипт:

function OpenIdLogon(e) {
        $.post("/Account/OpenIdLogOn/", { token: e }, function (data) {
            $("#userNavigation").html(data);
            $(".auth_box").hide();
            $(".kb_fading").hide();
        });
    }

Это действие:

public ActionResult OpenIdLogOn(string token)
        {
            WebClient cli = new WebClient();
            string json = cli.DownloadString(new Uri("http://ulogin.ru/token.php?token=" + Request.Params["token"] + "&host=" + Request.Url.Host));
            var obj = JObject.Parse(json);
            if (obj["error"] == null)
            {
                var userName = obj["nickname"].Value<string>();
                var email = obj["email"].Value<string>();
                FormsAuthentication.SetAuthCookie(userName, true);                    
            }

            return PartialView("UserNavigation");
        }

И, моя UserNavigation:

@if (Request.IsAuthenticated)
{
    <a href="#" class="username"><span>@Context.User.Identity.Name</span><i class="icon iUser"></i></a>
    <ul class="headLine_link">
        <li><a href="#">Profile</a></li>
        <li>
            @Html.ActionLink("Logg Off", "LogOff", "Account", null, new { @class = "exit" })</li>
    </ul>

}
else
{    
    <ul class="headLine_link">
        <li><a id="regLink">Register</a></li>
        <li><a id="authLink">Log On</a></li>
    </ul>
}

Проблема в том, что Request.IsAuthenticated равно true только после обновления страницы.

1 Ответ

4 голосов
/ 02 марта 2012

Проблема заключается в следующем:

Во время выполнения запроса ($.post("/Account/OpenIdLogOn/"...) пользователь не аутентифицировался.

Затем в вашем методе действия вы аутентифицируете пользователя, но наОбъект запроса, представляющий запрос, сделанный пользователем перед созданием файла cookie Auth, не прошел проверку подлинности пользователя.Однако, как вы говорите при следующем запросе, он работает, поскольку в то время у пользователя есть файл cookie аутентификации, когда он делает запрос.

Одним из решений здесь может быть создание объекта Viewmodel дляотправить с вашего метода действия контроллера на ваш взгляд.Эта viewModel может иметь поле с именем authenticated, и вы можете установить его правильно из метода действия.Затем проверьте это значение вместо этого в вашем представлении.Я не проверял это в Visual Studio, но должно быть что-то вроде этого:

Создайте модель представления:

public class LoginViewModel{
  public bool Authenticated{ get; set; }
}

Ваш метод действия:

    public ActionResult OpenIdLogOn(string token)
    {
        WebClient cli = new WebClient();
        string json = cli.DownloadString(new Uri("http://ulogin.ru/token.php?token=" + Request.Params["token"] + "&host=" + Request.Url.Host));
        var obj = JObject.Parse(json);
        var viewModel = new LoginViewModel{ Authenticated = Request.IsAuthenticated };

        if (obj["error"] == null)
        {
            var userName = obj["nickname"].Value<string>();
            var email = obj["email"].Value<string>();
            FormsAuthentication.SetAuthCookie(userName, true);        
            viewModel.Authenticated = true;            
        }

        return PartialView("UserNavigation");
    }

И ваш взгляд

@model LoginViewModel
@if (Model.Authenticated)
{
  <a href="#" class="username"><span>@Context.User.Identity.Name</span><i class="icon iUser"></i></a>
  <ul class="headLine_link">
    <li><a href="#">Profile</a></li>
    <li>
        @Html.ActionLink("Logg Off", "LogOff", "Account", null, new { @class = "exit"     })</li>
  </ul>
}
else
{    
  <ul class="headLine_link">
    <li><a id="regLink">Register</a></li>
    <li><a id="authLink">Log On</a></li>
  </ul>
}

Создание модели представления вместо простой отправки bool в качестве модели просто потому, что мне нравится всегда помещать данные, которые я отправляю, в представление внутри модели представления.Позволяет значительно упростить последующее расширение и облегчить чтение в представлении (например, вы можете написать @if (Model.Authenticated) вместо @if (Model))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...