ASP.NET MVC - установить пользовательский IIdentity или IPrincipal

Существует одна причина, по которой наши стандарты кодирования требуют использования аксессуаров (которые также могут быть частными). Если вы быстро захотите узнать, какой код меняет поле, вы просто вызываете иерархию вызовов для сеттера в Eclipse!

Это огромная экономия времени в кодовой базе, которая достигла 2 миллионов строк кода, а также облегчает рефакторинг.

632
задан Kiquenet 18 May 2016 в 08:51
поделиться

2 ответа

Я не могу говорить напрямую для ASP.NET MVC, но для веб-форм ASP.NET хитрость заключается в создании FormsAuthenticationTicket и зашифровать его в cookie после аутентификации пользователя. Таким образом, вам нужно только один раз вызвать базу данных (или AD или что-то еще, что вы используете для аутентификации), и каждый последующий запрос будет аутентифицироваться на основе билета, хранящегося в cookie.

Хорошая статья по этому поводу: http://www.ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html (неработающая ссылка)

Изменить:

Поскольку ссылка выше не работает, я рекомендовал бы решение LukeP в своем ответе выше: https://stackoverflow.com/a/10524305 - Я бы также предложил изменить принятый ответ на этот. Альтернатива неработающей ссылке: https://web.archive.org/web/20120422011422/http://ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html

107
ответ дан 22 November 2019 в 21:51
поделиться

Вот пример выполнения работы. bool isValid устанавливается при просмотре некоторого хранилища данных (скажем, вашей пользовательской базы данных). UserID - это просто идентификатор, который я поддерживаю. Вы можете добавить дополнительную информацию, такую ​​как адрес электронной почты, в данные пользователя.

protected void btnLogin_Click(object sender, EventArgs e)
{         
    //Hard Coded for the moment
    bool isValid=true;
    if (isValid) 
    {
         string userData = String.Empty;
         userData = userData + "UserID=" + userID;
         FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(30), true, userData);
         string encTicket = FormsAuthentication.Encrypt(ticket);
         HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
         Response.Cookies.Add(faCookie);
         //And send the user where they were heading
         string redirectUrl = FormsAuthentication.GetRedirectUrl(username, false);
         Response.Redirect(redirectUrl);
     }
}

в golbal asax добавьте следующий код для получения вашей информации

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Request.Cookies[
             FormsAuthentication.FormsCookieName];
    if(authCookie != null)
    {
        //Extract the forms authentication cookie
        FormsAuthenticationTicket authTicket = 
               FormsAuthentication.Decrypt(authCookie.Value);
        // Create an Identity object
        //CustomIdentity implements System.Web.Security.IIdentity
        CustomIdentity id = GetUserIdentity(authTicket.Name);
        //CustomPrincipal implements System.Web.Security.IPrincipal
        CustomPrincipal newUser = new CustomPrincipal();
        Context.User = newUser;
    }
}

Когда вы собираетесь использовать информацию позже, вы можете получить доступ к своему настраиваемому принципалу следующим образом.

(CustomPrincipal)this.User
or 
(CustomPrincipal)this.Context.User

это позволит вам получить доступ к пользовательской информации.

63
ответ дан 22 November 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: