ASP.NET MVC: как использовать HttpContext.User - PullRequest
4 голосов
/ 26 августа 2009

Я действительно теряюсь в том, как использовать HttpContext.User. Я везде читал, что он отлично подходит для FormAutherication, но я просто не вижу, как это работает. Если я сделаю что-то вроде этого:

ControllerContext.HttpContext.User = new GenericPrincipal(GetUser(username, password), roles);

Что содержит ControllerContext.HttpContext.User? и как мне получить доступ к информации о пользователе таким образом?

Я думаю, что у меня есть Действие, подобное этому:

public User GetUser(string username, string password)
    {
        try
        {
            var user = (from u in dm.Users
                        join r in dm.Roles
                        on u.Role_ID_FK equals r.RoleID
                        where u.Username.Equals(username) && u.Password.Equals(password)
                        select u).Single();

            return user;
        }
        catch (Exception e)
        {
            return null;
        }
    }

И затем, если мне нужна информация о пользователе в моем представлении, такая как имя пользователя или роль, я могу вызвать ControllerContext.HttpContext.User.Username в моем представлении. Но это совершенно неправильный взгляд на это.

Так вы, ребята, можете дать мне пинок в правильном направлении или опубликовать ссылку на сайт, который может?

Ответы [ 2 ]

9 голосов
/ 26 августа 2009

Я не уверен, что именно вы пытаетесь сделать с кодом, который вы разместили, но вот некоторая помощь с HttpContext.User. С точки зрения непрофессионала, он представляет текущего пользователя , запрашивающего определенную страницу, и фактически в вашем контроллере вы можете просто ссылаться на него как на «пользователя» без префикса.

User.Identity сообщит вам, аутентифицирован ли пользователь, и если да, то его имя пользователя и способ аутентификации (Forms или Windows).

Обычно используется для получения имени пользователя, запрашивающего страницу, чтобы действия вашего контроллера могли выполнять правильные обязанности. Что-то вроде:

public ActionResult Index()
{
    //you should probably use the [Authorize] attribute on the Action Method
    //but you could check for yourself whether the user is authenticated...
    if (!User.Identity.IsAuthenticated)
         return RedirectToAction("LogIn");

    MyUser u = repository.GetUser(User.Identity.Name); //lookup user by username
    ViewData["fullname"] = u.FullName; //whatever...
    return View();
}

В этом примере, если пользователь не прошел аутентификацию, он будет перенаправлен на страницу входа в систему, и если это так, метод Action использует User.Identity.Name (это имя пользователя, в которое он вошел. с помощью или их логина Windows) для поиска и возврата экземпляра объекта MyUser из вашей базы данных и размещения полного имени пользователя в ViewData для отображения.

4 голосов
/ 26 августа 2009

В вашем логине используйте:

FormsAuthentication.SetAuthCookie("userName", remeberMe);

для установки аутентифицированного пользователя, тогда вы можете использовать

<%= User.Identity.Name %>
<%= User.IsInRole("role") %>
...