User.Identity.Name становится пустым, но я не могу понять, почему - PullRequest
1 голос
/ 02 августа 2011

В основном меня продолжают выбрасывать из моего приложения 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», в этот момент пользователь тоже обнуляется, теперь я нужно выяснить, какой файл не найден ...: (

1 Ответ

0 голосов
/ 02 августа 2011

Из вашего кода:

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
    };

Эта строка:

CompanyID = companies.Where(y => task.CompanyID == y.CompanyID).SingleOrDefault().Identifier

вызывает свойство Identifier для результата SingleOrDefault(), который может быть null.Вы проверили, что это нормально.Разве в этой строке выдается исключение?

Обратите внимание, что вы можете использовать IEnumerable вместо IQueryable;вероятно, не будет иметь никакого значения, но если это сбойная часть, вы можете попробовать ее даром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...