Вход в Ajax через ASP.Net MVC 2 - PullRequest
       1

Вход в Ajax через ASP.Net MVC 2

3 голосов
/ 09 августа 2010

Этот вопрос относится к Аутентификации с помощью ASP.NET Forms без перенаправления Только я не могу заставить его работать. MVC 2 изменил свои файлы сценариев, и теперь они получают, как указано здесь:

http://www.asp.net/ajaxlibrary/CDNAjax4.ashx

Сейчас я просто стреляю в темноте, но метод проб и ошибок сузил меня до включения

MicrosoftAjax.js
MicrosoftAjaxCore.js
MicrosoftAjaxComponentModel.js
MicrosoftAjaxSerialization.js
MicrosoftAjaxNetwork.js
MicrosoftAjaxWebServices.js
MicrosoftAjaxApplicationServices.debug.js

Проблема в том, что теперь я получаю исключение JavaScript:

Ошибка времени выполнения Microsoft JScript: Sys.InvalidOperationException: не указан путь к веб-службе.

Из поисков в поисках я обнаружил, что этот путь должен быть "~ / ScriptServices_AuthenticationService.asmx", но делать что-то вроде:

Sys.Services._AuthenticationService.DefaultWebServicePath = "~/ScriptServices_AuthenticationService.asmx";

не работает (я предполагаю, что это частный участник). Итак, вопрос, кто-нибудь знает, как заставить работать ajax / async FormsAuth? Есть ли исчерпывающее руководство по тому, от какого js-файла зависят различные службы MS Ajax? Наконец, если ничего из вышеперечисленного не существует, существует ли способ сделать FormsAuth на стороне сервера таким образом, чтобы он не перенаправлял (таким образом я могу просто вызвать действие контроллера с помощью формы ajax)? ... Я пытался использовать FormsAuthentication.SetAuthCookie (), но мне это не помогло.

Edit: Я выяснил, что FormsAuthentication.SetAuthCookie () на самом деле работает, но требует закрытия потока ответов (когда, конечно, буфер отправляется и куки устанавливаются). Это не работает для меня, так как это слишком поздно для моих целей.

Edit: Может понадобиться полное описание того, что я пытаюсь сделать. Форма ajax у меня есть для создания новой учетной записи. На стороне сервера я создаю учетную запись и вход в систему. В интерфейсе я жду события завершения ajax, а затем продвигаю форму мастера регистрации на следующую страницу, которая проходит через другие этапы регистрации. В псевдокоде действие контроллера выглядит так:

public JsonResult CreateAsync(LoginForm form)
{
    CreateAccount(form);

    FormsAuthentication.RedirectFromLoginPage(form.Email, false);

    return Json(
        new
        {
            Email = form.Email,
            Name = form.Name,
            Message = "Success"
        });
}

Метод входа в систему завершает поток ответов, а затем клиентский Ajax запутывается. Вместо этого я попробовал FormsAuth.SetAuthCookie, но у меня есть проблемы, описанные выше.

Ответы [ 3 ]

0 голосов
/ 18 августа 2010

Просто используйте jQuery для вызова метода вашего контроллера следующим образом.

$ ( "# login_button"). Нажмите (функция () {
$ .Ajax ({URL: "/ Controller / CreateAsync", данные: {E-mail: "someone@somewhere.com", Пароль: "asdfasfd"}, введите: "POST", dataType: "json",
успех: функция (данные) { // делаем что-то
})});

Документацию смотрите здесь. http://api.jquery.com/jQuery.ajax/

0 голосов
/ 18 августа 2010

О, неважно.На самом деле вы должны использовать FormsAuthentication.Authenticate () вместо RedirectFromLoginPage.

Вам нужно реализовать это поведение самостоятельно, если вы хотите вызвать метод как запрос JSON.

0 голосов
/ 12 августа 2010

Как вы делаете свою форму? Вы используете Html.Form или Ajax.Form? Если вы используете Ajax.Form (или даже Ajax.ActionForm), вы можете отправлять информацию для входа в контроллер без перенаправления и решать, когда перенаправлять или нет, даже после возврата обратного вызова в клиенте. Нет необходимости в услуге, и состояние аутентификации устанавливается на стороне сервера и передается клиенту.

У меня есть полный код, чтобы сделать это, если вы хотите попробовать этот подход. Я решил не показывать это правильно, потому что это может быть значительным изменением в вашей архитектуре, которое вы, возможно, не хотите делать. Если хотите, я выложу здесь.

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