Надеюсь, это простой вопрос. Мне никогда не приходилось сталкиваться с этой проблемой и не знаю, как начать.
Я разработал веб-приложение, которое мои пользователи устанавливают и запускают на своем собственном веб-сервере.
Я внедрил функцию, позволяющую своим пользователям изменять pw из 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 и т.д. Они должны были бы изменить, чтобы это работало?
<system.webServer>
<remove name="Session"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition=""/>
добавьте эту конфигурацию и убедитесь, что параметр сеанса имеет службу InProc или SQL или ASP.NET
HttpContext.Current
является нулевым во время запроса, использует.ConfigureAwait(false)
для асинхронных операций ... Так как ваш пример является строго синхронным, маловероятно, что причина ...Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name)
?