Я создал приложение MVC 4, которое предназначено для .NET 4.0. После развертывания на моем рабочем сервере он отобразит страницу входа, но не перенаправит страницу по умолчанию. Тем не менее, когда я добавляю отладку, я вижу, что процесс аутентификации работает, но затем ошибка, которую я получаю, - это ошибка, в которой говорится, что он не может найти мою страницу «Просмотр для моей ошибки», а затем показывает мою страницу ошибок. Кажется, что он не пойдет на мою страницу «Главная/Индекс» - даже когда я удалю атрибут authorize. Конечно, приложение работает в разработке. Кроме того, он не будет заходить на мою страницу регистрации или забыть страницу входа в систему.Приложение MVC 4 не переходит на страницу по умолчанию после входа в систему
Мои Войти Контроллер выглядит следующим образом:
[HttpPost]
[AllowAnonymous]
[ValidateAntiforgeryToken]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if(ModelStat.IsValid && _userService.Login(model.UserId, model.Password))
{
var user = _userService.GetUser(model.UserId);
var loggedInUser = new LoggedInUser
{
// Build the user for custom IPrincipal
};
var userData = JsonConvert.SerializeObject(loggedInUser);
var compressData = StringCompression.Compress(userData);
var authTicket = new FormsAuthenticationTicket(
1,
user.UserId,
DateTime.Now,
DateTime.Now.AddHours(1),
false,
compressData);
var encTicket = FormsAuthentication.Encrypt(authTicket);
if(encTicket != null)
{
var faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)
{
HttpOnly = true
};
Response.Cookies.Add(faCookie);
}
user.LastActivityDate = DateTime.Now;
user.LastLoginDate = DateTime.Now;
_userService.UpdateUser(user);
_uow.Commit();
return Url.IsLocalUrl(returnUrl) ? (ActionResult)Redirect(returnUrl) : RedirectToAction("Index", "Home");
}
return View(model);
и в моей Global.asax:
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if(authCookie != null)
{
var decompressedData = StringCompression.Decompress(authTicket.UserData);
var loggedInUser = JsonConvert.DesrializeObject<LoggedInUser>(decompressedData);
var currrentUser = new CustomPrincipal(authTicket.Name)
{
// Build the CustomPrincipal from the loggedInUser
};
if(HttpContext.Current.User.Identity.IsAuthenticated)
{
HttpContext.Current.User = currentUser;
}
}
}
Я надеюсь, что этого достаточно, чтобы дать кому-то представление о том, что я могу делать неправильно , Каким-то образом я чувствую, что это что-то маленькое, что мне не хватает. Заранее спасибо. ~ InDireStraits
Update:
После дополнительного устранения неполадок, казалось бы, что этот вопрос может иметь что-то делать с тем, что я использую BaseController для определения прав, но я до сих пор озадачен, почему приложение работает по назначению в моей среде разработки, но не в производстве. Чтобы проверить мои настройки IIS, я установил приложение MVC4 по умолчанию для производства, которое не имеет .NET 4.5, и оно выполняется. Я использую VS 2012, поэтому у меня есть 4.5. Могу ли я каким-то образом внедрять классы или функциональные возможности .NET 4.5, даже если это предназначено для .NET 4.0? Во всяком случае, вот мой BaseController код:
public class BaseController: Controller
{
private string _actionKey;
private const string PermisisionList = "permissionList";
private Dictionary<string, string> _requiredActionPermissions;
private static readonly IControllerActionService<ControllerAction> _actionService;
protected new CustomPrincipal User
{
get
{
return HttpContext.User as CustomPrincipal;
}
}
public BaseController(IControllerActionService<ControllerAction> actionService)
{
_actionService = actionService;
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Check to see if the PermissionList is loaded and load if necessary
if(!CacheLayer.Exists(PermissionList))
{
_requiredActionPermissions = _actionService.GetControllerActionDictionary();
CacheLayer.Add(_requiredActionPermissions, PermissionList);
}
else
{
_requiredActionPermission = CacheLayer.Get<Dictionary<string, string>>(PermissionList);
}
// Get the Controller/Action of the current request
_actionKey = string.Format("{0}-{1}", filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName);
// If the user is authenticated, grab the permissions
if(filterContext.HttpContext.User.Identity.IsAuthenticated)
{
var userPermissions = User.Permissions;
if(!_requiredActionPermissions.Values.Any(a=>a.Equals(_actionKey, StringComparison.OrdinalIgnoreCase)))
{
return;
}
if(userPermissions.Contains(_requiredActionsPermissions.FirstOrDefault(x=>x.Value == _actionKey).Key))
{
return;
}
filterContext.Result = new RedirectResult("~/Error/ErrorUnauthorized");
return;
}
if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if(!_requiredActionPermissions.Values.Any(a=>a.Equals(_actionKey, StringComparison.OrdinalIgnoreCase)))
{
return;
}
}
if(filterContext.HttpContext.Request.Url == null)
{
return;
}
if(filterContext.HttpContext.Request.Url.AbsolutePath == FormsAuthentication.LoginUrl)
{
return;
}
var redirectUrl = string.Format("?returnUrl={0}", filterContext.HttpContext.Request.Url.PathAndQuery);
filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + redirectUrl, true);
}
UPDATE 2: Установка .NET 4,52 на Балетмейстер сервер и приложение теперь работает как задумано. Проблема в том, что я не смогу установить это на производственном сервере. Я не понимаю, что такое 4.5, что исправление 4.0, похоже, не облегчает. HELLLLLLPPP !!!!!!