Лучшая практика для установки / получения информации о том, вошел ли пользователь в систему или нет - PullRequest
1 голос
/ 06 января 2010

Я знаю, что подобные вопросы были заданы ранее, но я не смог найти дубликат, который конкретно обрабатывает ASP.NET MVC (и аспект контроллера).

Мой вопрос таков:

В модели MVC я понимаю, что контроллер должен обрабатывать использование HttpContext, чтобы определить, кто вошел в систему, если таковые имеются. Это сделано для того, чтобы контроллер мог представить эту информацию представлению, чтобы самому представлению не приходилось выполнять эти поиски.

Есть ли какой-нибудь стандарт де-факто, как это сделать?

Моя текущая настройка выглядит следующим образом [упрощенно]

У меня есть BaseController, который наследуют все остальные мои контроллеры.

В BaseController я выполняю следующее переопределение:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
     base.Initialize(requestContext);
     ViewData["IsUserLoggedIn"] = IsUserLoggedIn; // bool property checking HttpContext.User.Identity.IsAuthenticated;
     ViewData["CurrentUser"] = CurrentUser; // Property returning logged in user, or null.

}

Затем, естественно, в моих представлениях я могу проверить значения ViewData.

Как вы делаете это? Я хотел бы знать, если что-то не так с моей настройкой, и если так, что не так? Я не на 100% доволен своим решением, в основном потому, что я не слишком знаком с циклом и не уверен, поместил ли мой код в правильном месте.

Я знаю, что здесь может не быть «один ответ связывает их всех», я принимаю ответ, который предлагает наибольшее понимание.

Ответы [ 2 ]

2 голосов
/ 06 января 2010

Обычно я помещаю зашифрованный элемент в файл cookie. Этот элемент может быть чем угодно, но я обычно делаю его именем пользователя.

Затем в Global.asax.cs я реализую Application_AuthenticateRequest. Каждый раз, когда страница загружается, этот метод вызывается системой. В этом методе я проверяю cookie, если он существует, я пытаюсь загрузить пользователя. Если пользователь загружается успешно, я знаю, что у меня есть вошедший в систему пользователь, и я установил текущее свойство Principal текущего потока для этого пользователя.

Как только CurrentPrincipal установлен в текущем потоке, вы можете получить доступ к этому пользователю из вашего Контроллера, вашего Представления, вашего Бизнес-уровня, в любом месте вашего пути выполнения.

Если по какой-то причине я не могу использовать куки-файлы, я передам их во ViewData (снова на всякий случай зашифрованные) и сохраню в скрытых переменных. Затем, когда запускается Controller :: OnActionExecuting, я выполняю ту же работу, которую обычно выполнял в AuthenticateRequest (т.е. загружал пользователя и помещал его в поток).

0 голосов
/ 07 января 2010

У меня есть класс BaseController, от которого наследуются все мои контроллеры. У него есть свойство CurrentUser, которое хранится в сеансе. Полный код для моего контроллера имеет немного больше логики для извлечения пользователя, но это основная идея.

public class BaseController : Controller
{

User _currentUser = null;
public User CurrentUser
{
    get
    {
        if (_currentUser == null)
            _currentUser = (User)HttpContext.Session["CurrentUser"];

        return _currentUser;

    }
    set
    {
        _currentUser = value;
        HttpContext.Session["CurrentUser"] = value;
        }
    }
}


}

Все мои модели наследуются от класса BaseModel, который также имеет свойство CurrentUser.

public class BaseModel
{
    public User CurrentUser { get; set; }
}

public class HomeIndexData : BaseModel
{

}

Затем мои контроллеры передают пользователя модели, что позволяет мне иметь строго типизированные представления.

[HttpGet]
public ActionResult Index()
{
    HomeIndexData data = new HomeIndexData();
    data.CurrentUser = this.CurrentUser;

    return View(data);
}

С помощью этой техники я также могу создать главную страницу со строгим шрифтом, используя BaseModel.

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<BaseModel>" %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...