2015-02-18 2 views
0

Я создал приложение 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 !!!!!!

ответ

0

Ответ можно найти here. Подводя итог, я добавил дополнительный параметр в конфигурацию маршрута, который работал в версии 4.5, но не в 4.0. Будет следить за связанным вопросом. Спасибо

Смежные вопросы