В основном меня продолжают выбрасывать из моего приложения asp.net mvc, потому что User.Identity.IsAuthenticated имеет значение false, это происходит только из-за кода ниже, относящегося к комментариям к задаче (отмечен ** ниже) - я не могу понять, почему это происходит, любая помощь приветствуется.
Код ниже внутри настраиваемого атрибута на моем базовом контроллере, который аутентифицирует пользователей, если не аутентифицирован, я выбрасываю исключение следующим образом:
if (!httpContext.User.Identity.IsAuthenticated)
throw new NoAccessException("unauthorized user"); // invalid users are thrown out...
Код, который приводит к тому, что User.Identity.IsAuthenticated + User.Identity.Name становится пустым:
[HttpGet]
public ActionResult TaskDetail(int houseid, int taskid)
{
//NOTE: _repo is a simple ISession over Linq to Sql
//GetCurrentUser() is a extention method which gets the current logged on user
//i.e. User.Identity.Name so I can get the users credentials
var loggedonuser = _repo.GetCurrentUser();
var _house= _repo.Single<House>(x => x.HouseID== houseid&& x.ClientID== loggedonuser.CompanyID);
if (_house== null)
throw new NoAccessException();
var summary = _instruction.ToSummaryDTO();
var companies = _repo.All<Company>();
//var users = _repo.All<User>();
var task = _repo.Single<Task>
(x => x.HouseID== _house.HouseID && x.CompanyID == loggedonuser.CompanyID);
var dto = new TaskDTO
{
TaskID = task.TaskID,
Title = task.Title,
Description = task.Description,
DateCreated = task.DateCreated,
IsClosed = task.IsClosed,
CompanyID = companies.Where(y => task.CompanyID == y.CompanyID).SingleOrDefault().Identifier
};
**dto.AllComments** = _repo.All<TaskComment>()
.Where(x => x.TaskID == task.TaskID)
.OrderByDescending(x => x.Timestamp)
.Select(x => new TaskCommentDTO
{
Comment = x.Comment,
Timestamp = x.Timestamp,
CompanyID = companies.Where(y => x.CompanyID == y.CompanyID).SingleOrDefault().Identifier
});
return View(new TaskViewModel
{
Summary = summary,
TaskDetail = dto,
});
}
ПРИМЕЧАНИЕ: Если я опускаю dto.AllComments (IQueryable), то все работает нормально, я никогда не выкидываю свою систему или, что еще важнее, User.Identitiy остается верным .... Я пытался преобразовать перечислить - это то, что я в идеале хочу, однако, это тоже не работает, возможно, что-то не так с моим методом linq ...
Мой DTO:
public class TaskDTO
{
public int TaskID { get; set; }
public bool IsClosed { get; set; }
public string CompanyID { get; set; }
public string AssignedTo { get; set; }
public DateTime DateCreated { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public IQueryable<TaskCommentDTO> AllComments { get; set; }
}
public class TaskCommentDTO
{
public string CompanyID { get; set; }
public string UserID { get; set; }
public DateTime Timestamp { get; set; }
public string Comment { get; set; }
}
РЕДАКТИРОВАТЬ: где выбрасывается исключение
Теперь я отследил исключение, я переопределил приведенный ниже код в моем базовом контроллере, который помог мне обнаружить ошибку:
protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
base.Execute(requestContext);
}
После того, как страница закончила загрузку, этот код был запущен еще раз, когда я проверил контекст запроса. В значениях для RouteData я обнаружил «Error» и «FileNotFound», в этот момент пользователь тоже обнуляется, теперь я нужно выяснить, какой файл не найден ...: (