Arhn - архитектура программирования

получение имени пользователя, которое установлено в UserData FormsAuthenticationTicket

Я думаю о том, чтобы получить имена пользователей моего сайта, используя это, на мой взгляд (синтаксис Razor):

@MySite.Helpers.Utils.UserName

вот класс утилит:

public class Utils
{
    static FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;

    public static string UserName { get { return id.Ticket.UserData; } }
}

Есть ли потенциальные проблемы с этим кодом?

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

Я обрабатываю это так, потому что я использую facebook connect и хочу сохранить там идентификатор в поле имени пользователя в БД и их имена пользователей/полные имена в отдельной таблице.

поэтому моя логика для обработки имен пользователей facebook и зарегистрированных на моем сайте имен пользователей должна обрабатываться по-разному. После входа в систему я думаю обработать его там, а затем установить пользовательские данные в качестве фактического имени пользователя.

поэтому на всем сайте я могу просто получить имя вошедшего в систему пользователя, используя: @MySite.Helpers.Utils.UserName

это звучит нормально? будет ли проблемой тот факт, что это статическая переменная?

или есть лучший способ управлять этим? переменные сеанса может быть?

Благодарность


  • Я почти уверен, что сохранение id в качестве статической переменной вызовет у вас проблемы. Вместо этого сделайте это собственностью. 23.12.2010
  • @jbinto это неточное утверждение, поскольку в операции значение id привязано к контекстуальному экземпляру во время выполнения через объект HttpContext.Current. Благодаря тому, как @raklos закодировал это, вы можете гарантировать, что во время выполнения вы получите доступ к идентификатору только для текущего запроса, если вы находитесь в состоянии, в котором нет доступа к HttpContext.Current, вы получите ошибку нулевой ссылки. 11.02.2011

Ответы:


1

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

Имя пользователя, вошедшего в систему в данный момент, уже сохранено в файле cookie аутентификации. Вам не нужно сохранять его еще раз в UserData. И чтобы получить его в своем шаблоне Razor, вы можете просто:

@User.Identity.Name

Очевидно, что рекомендуется украсить действие контроллера, отображающее это представление, атрибутом [Authorize], чтобы гарантировать, что пользователь аутентифицирован перед доступом к нему, иначе вы можете получить NullReferenceException с этим кодом.

В качестве альтернативы вы можете написать помощник:

public static MvcHtmlString Username(this HtmlHelper htmlHelper)
{
    var identity = htmlHelper.ViewContext.HttpContext.User.Identity;
    if (identity.IsAuthenticated)
    {
        return MvcHtmlString.Create(identity.Name);
    }
    return MvcHtmlString.Empty;
}

который вы могли бы использовать следующим образом:

@Html.Username()
23.12.2010
  • Я понимаю это, но продолжаю объяснять, почему я храню его там. мои имена пользователей facebook хранятся в другой таблице. В основном мне нужен простой способ получить имя пользователя, будь то пользователь facebook или зарегистрированный пользователь сайта. 23.12.2010
  • @raklos, поэтому имя пользователя, хранящееся в UserData, не совпадает с именем, хранящимся в файле cookie аутентификации, т. Е. Пользователь, вошедший в систему в данный момент, отличается от пользователя, сохраненного в свойстве UserData? 23.12.2010
  • @Darin - Люди, которые регистрируются на моем сайте - @User.Identity.Name дадут имя пользователя. люди, которые регистрируются с помощью facebook @User.Identity.Name, сообщают свой идентификатор facebook — набор цифр. Их имена хранятся в отдельной таблице. Я хочу беспрепятственно получить имя пользователя одним способом, поэтому я рассматриваю возможность размещения его в UserData. 23.12.2010
  • @raklos, хорошо, теперь я понимаю. Так что вам просто нужно немного перенастроить мой вспомогательный метод, и все будет готово. Лично я предпочитаю вспомогательный метод вместо использования статических методов. 23.12.2010
  • @Darin, - Нужно ли включать @using Mysite.Helpers.Extensions; в каждом представлении, использующем имя пользователя? 23.12.2010
  • @раклос, совсем нет. Поместите помощника в статический класс, а затем просто добавьте пространство имен, в котором этот класс определен, в раздел <namespaces> вашего web.config: <namespaces><add namespace="YourNamespace"/></namespaces>. Тогда во всех шаблонах можно было просто написать @Html.Username(). Это простой метод расширения класса HtmlHelper. И если вы определите его в пространстве имен System.Web.Mvc.Html, ничего не поделаешь: он будет доступен автоматически. 23.12.2010
  • :( Я получаю эту ошибку: «System.Web.Mvc.HtmlHelper‹dynamic›» не содержит определения для «Имя пользователя» и нет метода расширения «Имя пользователя», принимающего первый аргумент типа «System.Web.Mvc.HtmlHelper‹». dynamic›» (вам не хватает директивы using или ссылки на сборку? 23.12.2010
  • @raklos, где вы объявили метод расширения? В каком классе в каком пространстве имен? 23.12.2010
  • класс называется Extensions в пространстве имен MySite.Helpers. 23.12.2010
  • @raklos, а вы добавили <add namespace="MySite.Helpers"/> в раздел пространств имен вашего web.config? Убедитесь, что класс является общедоступным статическим и что метод расширения является общедоступным статическим, точно так же, как в моем примере. Если у вас по-прежнему возникают проблемы с написанием собственного помощника, вы можете ознакомиться со следующим подробным пошаговым руководством: asp.net/mvc/tutorials/creating-custom-html-helpers-cs и особенно вторую часть, посвященную методам расширения. Также попробуйте перекомпилировать и запустить приложение хотя бы один раз. Это может быть какая-то неприятная ошибка VS в режиме разработки. 23.12.2010
  • теперь это работает: - ​​stackoverflow.com/questions/4136703/ пришлось закрыть и снова открыть файлы! грр 23.12.2010
  • @raklos, да, Intellisense далек от совершенства. Я никогда не доверяю этому кстати во взглядах. Я всегда запускаю приложение и смотрю, что происходит во время выполнения. 23.12.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..