HttpContext.Current.Session является нулевым на некоторых серверах

1

Надеюсь, это простой вопрос. Мне никогда не приходилось сталкиваться с этой проблемой и не знаю, как начать.

Я разработал веб-приложение, которое мои пользователи устанавливают и запускают на своем собственном веб-сервере.

Я внедрил функцию, позволяющую своим пользователям изменять pw из pw по умолчанию. Это отлично работает практически на всех серверах. Однако у меня есть новый клиент, который не может его использовать.

Текущий подход следует следующим шагам:

  1. Пользователь входит в систему по умолчанию pw
  2. Пользователь переходит к представлению, где должен создать новый pw (в противном случае их учетная запись приостанавливается)
  3. При успешном изменении pw пользователь выводится на главный экран.

Для большинства компаний это работает так, как ожидалось. Однако на этом сервере Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name) всегда имеет значение null, поскольку Current равно null. Если я запустил приложение локально и подключился к их db, он работает так, как ожидалось. Но, если я запустил его на своих серверах (тот же код только на своем сервере подключен к тому же самому db), это значение равно null и сбой pw не выполняется.

Какую дополнительную информацию мне нужно предоставить для справки по этой проблеме?

UPDATE: вот код, который я вызываю: скрипт, который вызывается при нажатии кнопки:

var $account = {
changePw: function (homeUrl, reset) {
    $(".ui-widget").css("display", "none");
    var newPw1 = $("#newPw1").val();
    var newPw2 = $("#newPw2").val()
    if (newPw1 != newPw2) {
        $("#pwDontMatch").css("display", "block");
    }
    else {
        var url = rootUrl + "Account/ChangePassword";
        var data = {
            oldPassword: $("#currPw").val(),
            newPassword: $("#newPw1").val(),
            reset: "false"
        };
        if (reset) {
            data = { newPassword: $("#newPw1").val(), reset: "true", userId: $("#userIdTxt").val() };
        }

        $.ajax({
            url: url,
            data: data,
            success: function (data) {
                if (data.success != null && data.success == "true") {
                    $("#changeSuccess").css("display", "block");
                    setTimeout(function () { document.location.href = homeUrl; }, 3000);
                }
                else {
                    $("#error").css("display", "block");
                    if (data.error != null) {
                        $("#errMsg").html(data.error);
                    }
                }
            },
            failure: function () {
                $("#error").css("display", "block");
            },
            type: "POST"
        });
    }
}
};

И контроллер, вызванный скриптом:

    /// <summary>
    /// This can be called from the change password page or the reset password page
    /// </summary>
    /// <param name="form"></param>
    /// <returns></returns>
    [HttpPost]
    public JsonResult ChangePassword(FormCollection form)
    {
        JsonResult jr;

        // ChangePassword will throw an exception rather
        // than return false in certain failure scenarios.
        try
        {
            bool changePasswordSucceeded;
                MembershipUser currentUser = Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name, true /* userIsOnline */) ??
                    Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name);
                if (currentUser != null)
                {
                    try
                    {
                        changePasswordSucceeded = urrentUser.ChangePassword(form["oldPassword"], form["newPassword"]);
                        if (changePasswordSucceeded)
                        {
                            currentUser.IsApproved = true;
                            Membership.UpdateUser(currentUser);

                            if (currentUser.ProviderUserKey != null)
                            {
                                var mxUser = new MxUser(currentUser.ProviderUserKey.ToString());
                                Session["User"] = mxUser;
                                jr = Json(new {success = "true"});
                            }
                            else jr = Json(new {success = "false",error = "Cannot find ProviderUserKey."});

                        }
                        else jr = Json(new{success = "false",error = "Cannot update the user password."});
                    }
                    catch
                    { jr = Json(new{success = "false",error = "Unexpected error in updating the user password."}); }
                }
                else jr = Json(new {success = "false", error = "Cannot find the user"});
        }
        catch (Exception ex)
        { jr = Json(new {success = "false", error = ex.Message}); }
        return jr;
    }

Если ничего, какие настройки, config и т.д. Они должны были бы изменить, чтобы это работало?

  • 0
    Единственная причина, по которой я знаю, почему HttpContext.Current является нулевым во время запроса, использует .ConfigureAwait(false) для асинхронных операций ... Так как ваш пример является строго синхронным, маловероятно, что причина ...
  • 0
    Где находится эта строка Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name) ?
Показать ещё 8 комментариев
Теги:
asp.net-mvc
asp.net-membership

1 ответ

0
<system.webServer>     

<remove name="Session"/>     
<add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition=""/>     


добавьте эту конфигурацию и убедитесь, что параметр сеанса имеет службу InProc или SQL или ASP.NET

Ещё вопросы

Сообщество Overcoder
Наверх
Меню