Проблема заключается в следующем:
Во время выполнения запроса ($.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)
)