Возможно, вас заинтересуют функции Атомных операций Глиба ,
g_atomic_int_compare_and_exchange()
реализует семантику CAS для различных архитектур. Сама реализация относительно проста для понимания и может использоваться автономно без особых усилий, вы можете найти ее на svn.gnome.org/viewvc/ в glib / trunk / glib / gatomic. {C, h}. Надеюсь, это поможет!
Похоже, вы не можете получить его из объект User, но вы можете получить его следующим образом:
Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
Во-первых, этот ответ не является строго ответом MVC, а является ответом ASP.NET. Тот факт, что ваш сайт является MVC, в данном случае не имеет отношения к решению проблемы.
Хм. Я не очень уверен, как вы обращаетесь со своими пользователями в своей системе, но похоже, что вы используете (очень злого) провайдера членства asp.net
, который поставляется с .net из коробки. На это указывает тот факт, что вы сказали
В системе аутентификации форм по умолчанию, которая использует значение по умолчанию FormsIdentity , у него есть только одно свойство под названием Name (как вы правильно заметили). Это означает, что у него есть только одно значение, в котором можно разместить уникальную информацию о пользователе. В вашем случае вы указываете Name / UserName / DisplayName , в свойстве Имя
. Я предполагаю, что это имя является их отображаемым именем, и оно уникально. Какое бы значение вы здесь ни вводили, оно ДОЛЖНО БЫТЬ УНИКАЛЬНЫМ .
Отсюда вы можете получить руководство пользователя.
Проверьте это.
using System.Web.Security;
....
// NOTE: This is a static method .. which makes things easier to use.
MembershipUser user = Membership.GetUser(User.Identity.Name);
if (user == null)
{
throw new InvalidOperationException("User [" +
User.Identity.Name + " ] not found.");
}
// Do whatever u want with the unique identifier.
Guid guid = (Guid)user.ProviderUserKey;
Итак, каждый раз, когда вы хотите получить информацию о пользователе, вам нужно получить ее из базы данных, используя приведенный выше статический метод.
Прочтите все о классе членства и классе MembershipUser в MSDN.
Таким образом, я бы КЭШировал этот результат, чтобы вам не приходилось постоянно обращаться к базе данных.
... cont from above....
Guid guid = (Guid)user.ProviderUserKey;
Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.
В противном случае вы можете создать свой собственный класс Identity (который наследуется от IIdentity ) и добавьте свои собственные свойства, например UserID
. Затем, всякий раз, когда вы аутентифицируетесь (а также при каждом запросе), вы можете установить это значение. В любом случае, это серьезное решение, поэтому приступайте к кэшированию прямо сейчас.
HTH
Если вы используете членство в ASP.NET (которое, в свою очередь, использует объект IPrincipal):
using System.Web.Security;
{
MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
}
User.Identity всегда возвращает состояние текущего пользователя, вошел он в систему или нет.
Анонимный или нет и т. Д. Итак, выполняется проверка:
if (User.Identity.IsAuthenticated)
{
...
}
Итак, собираем все вместе:
using System.Web.Security;
{
if (User.Identity.IsAuthenticated)
{
MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
}
}
Свойство ProviderUserKey.
System.Web.Security.MembershipUser u;
u.ProviderUserKey
Если вы используете свой собственный объект IPrincipal для авторизации, вам просто нужно преобразовать его, чтобы получить доступ к идентификатору.
Например:
public class MyCustomUser : IPrincipal
{
public int UserId {get;set;}
//...Other IPrincipal stuff
}
Вот отличный учебник по созданию собственного Аутентификация на основе форм.
http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx
Это должно указать вам правильный путь к созданию файла cookie аутентификации для вашего пользователя и доступу к вашему пользовательскому пользователю данные.