ASP.NET MVC - Özel IIdentity veya IPrincipal ayarla


650

Oldukça basit bir şey yapmam gerekiyor: ASP.NET MVC uygulamamda özel bir IIdentity / IPrincipal ayarlamak istiyorum. Hangisi daha kolay / daha uygunsa. Ben böyle bir şey diyoruz böylece varsayılan uzatmak istiyorum User.Identity.Idve User.Identity.Role. Hiçbir şey fantezi, sadece bazı ekstra özellikler.

Tonlarca makale ve soru okudum ama aslında olduğundan daha zorlaştırıyormuşum gibi hissediyorum. Kolay olacağını düşündüm. Bir kullanıcı oturum açarsa, özel bir IIdentity ayarlamak istiyorum. Ben de Application_PostAuthenticateRequestglobal.asax'ımda uygulayacağımı düşündüm . Ancak, bu her istek üzerine çağrılır ve ben veritabanından tüm verileri talep ve özel bir IPrincipal nesne koymak her istek üzerine veritabanına bir çağrı yapmak istemiyorum. Bu da çok gereksiz, yavaş ve yanlış yerde (orada veritabanı çağrıları yapıyor) görünüyor ama yanlış olabilir. Veya bu veriler başka nereden gelirdi?

Bir kullanıcı oturum açtığında, oturumuma Application_PostAuthenticateRequestolay işleyicisindeki özel IIdentity'ye eklediğim bazı gerekli değişkenleri ekleyebileceğimi düşündüm . Ancak, benim Context.Sessionise nullo gitmek için yol da değil yani, orada.

Bir gündür bunun üzerinde çalışıyorum ve bir şeyleri özlediğimi hissediyorum. Bunu yapmak çok zor olmamalı, değil mi? Ayrıca bununla birlikte gelen tüm (yarı) ilgili şeyler ile biraz kafam karıştı. MembershipProvider, MembershipUser, RoleProvider, ProfileProvider, IPrincipal, IIdentity, FormsAuthentication.... Am ben tek herkese bu çok kafa karıştırıcı bulur?

Birisi bana tüm ekstra fuzz olmadan IIdentity bazı ekstra veri saklamak için basit, zarif ve verimli bir çözüm söyleyebilirdi .. bu harika olurdu! SO hakkında benzer sorular olduğunu biliyorum ama ihtiyacım olan cevap oradaysa, gözden kaçırmış olmalıyım.


1
Merhaba Domi, yalnızca çerezde yansıtılması gereken verileri değiştirdikten sonra hiçbir zaman değişmeyen verileri (bir kullanıcı kimliği gibi) depolamanın veya çerezi doğrudan güncellemenin bir kombinasyonudur. Bir kullanıcı bunu yaparsa, çerezi yeni verilerle güncellerim. Ancak sık sık değişen verileri saklamaya çalışıyorum.
Razzie

26
Bu soru 36 bin görüş ve çok sayıda oy hakkına sahiptir. bu gerçekten ortak bir gereklilik mi - eğer öyleyse tüm bu 'özel şeylerden' daha iyi bir yol yok mu?
Simon_Weaver

2
@Simon_Weaver Şifrelenmiş çerezdeki ek özel bilgileri daha kolay destekleyen ASP.NET Kimlik bilgisi vardır.
John

1
Seni yayınlanmıştır gibi çok bilgiye yoktur, size katılıyorum: MemberShip..., Principal, Identity. ASP.NET, kimlik doğrulamasıyla başa çıkmak için bunu daha kolay, basit ve en fazla iki yaklaşım haline getirmelidir.
geniş bant

1
@Simon_Weaver Bu, daha basit, daha kolay, daha esnek kimlik sistemi IMHO'ya olan talebi açıkça göstermektedir.
niico

Yanıtlar:


838

İşte böyle yapıyorum.

IIdentity yerine IPrincipal kullanmaya karar verdim çünkü hem IIdentity'yi hem de IPrincipal'i uygulamak zorunda olmadığım anlamına geliyor.

  1. Arayüzü oluşturun

    interface ICustomPrincipal : IPrincipal
    {
        int Id { get; set; }
        string FirstName { get; set; }
        string LastName { get; set; }
    }
  2. CustomPrincipal

    public class CustomPrincipal : ICustomPrincipal
    {
        public IIdentity Identity { get; private set; }
        public bool IsInRole(string role) { return false; }
    
        public CustomPrincipal(string email)
        {
            this.Identity = new GenericIdentity(email);
        }
    
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
  3. CustomPrincipalSerializeModel - FormsAuthenticationTicket nesnesindeki kullanıcı verileri alanına özel bilgileri serileştirmek için.

    public class CustomPrincipalSerializeModel
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
  4. LogIn yöntemi - özel bilgileri içeren bir çerez ayarlama

    if (Membership.ValidateUser(viewModel.Email, viewModel.Password))
    {
        var user = userRepository.Users.Where(u => u.Email == viewModel.Email).First();
    
        CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel();
        serializeModel.Id = user.Id;
        serializeModel.FirstName = user.FirstName;
        serializeModel.LastName = user.LastName;
    
        JavaScriptSerializer serializer = new JavaScriptSerializer();
    
        string userData = serializer.Serialize(serializeModel);
    
        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                 1,
                 viewModel.Email,
                 DateTime.Now,
                 DateTime.Now.AddMinutes(15),
                 false,
                 userData);
    
        string encTicket = FormsAuthentication.Encrypt(authTicket);
        HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        Response.Cookies.Add(faCookie);
    
        return RedirectToAction("Index", "Home");
    }
  5. Global.asax.cs - Çerez okumak ve HttpContext.User nesnesini değiştirmek, bu PostAuthenticateRequest geçersiz kılınarak yapılır

    protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    
            JavaScriptSerializer serializer = new JavaScriptSerializer();
    
            CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData);
    
            CustomPrincipal newUser = new CustomPrincipal(authTicket.Name);
            newUser.Id = serializeModel.Id;
            newUser.FirstName = serializeModel.FirstName;
            newUser.LastName = serializeModel.LastName;
    
            HttpContext.Current.User = newUser;
        }
    }
  6. Ustura görünümlerinde erişim

    @((User as CustomPrincipal).Id)
    @((User as CustomPrincipal).FirstName)
    @((User as CustomPrincipal).LastName)

ve kodda:

    (User as CustomPrincipal).Id
    (User as CustomPrincipal).FirstName
    (User as CustomPrincipal).LastName

Kodun kendi kendini açıklayıcı olduğunu düşünüyorum. Değilse, bana bildirin.

Ayrıca, erişimi daha da kolaylaştırmak için bir temel denetleyici oluşturabilir ve döndürülen Kullanıcı nesnesini (HttpContext.User) geçersiz kılabilirsiniz:

public class BaseController : Controller
{
    protected virtual new CustomPrincipal User
    {
        get { return HttpContext.User as CustomPrincipal; }
    }
}

ve sonra, her denetleyici için:

public class AccountController : BaseController
{
    // ...
}

Bu, koddaki özel alanlara şu şekilde erişmenizi sağlar:

User.Id
User.FirstName
User.LastName

Ancak bu görünümlerin içinde çalışmaz. Bunun için özel bir WebViewPage uygulaması oluşturmanız gerekir:

public abstract class BaseViewPage : WebViewPage
{
    public virtual new CustomPrincipal User
    {
        get { return base.User as CustomPrincipal; }
    }
}

public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
    public virtual new CustomPrincipal User
    {
        get { return base.User as CustomPrincipal; }
    }
}

Views / web.config dosyasında varsayılan sayfa türü yapın:

<pages pageBaseType="Your.Namespace.BaseViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
  </namespaces>
</pages>

ve görünümlerde buna şu şekilde erişebilirsiniz:

@User.FirstName
@User.LastName

9
Güzel uygulama; özel yöneticinizi bir RolePrincipal ile değiştirerek RoleManagerModule'a dikkat edin. Bu bana çok acı verdi - stackoverflow.com/questions/10742259/…
David Keaveny

9
Tamam çözümü buldum, sadece e-posta olarak "" (boş dize) geçiren başka bir anahtar ekleyin ve Kimlik anonim olacaktır.
Pierre-Alain Vigeant

3
DateTime.Now.AddMinutes (N) ... N dakika sonra kullanıcının oturumunu kapatmaması için bu nasıl yapılır, oturum açmış kullanıcı kalıcı olabilir (kullanıcı örneğin 'Beni Hatırla' seçeneğini işaretlediğinde)?
1110

4
Eğer WebApiController kullanıyorsanız, sette gerekecek Thread.CurrentPrincipalde Application_PostAuthenticateRequesto dayanmaz olarak çalışmaya bunun içinHttpContext.Current.User
Jonathan Levison'un evinde

3
@AbhinavGujjar FormsAuthentication.SignOut();benim için iyi çalışıyor.
LukeP

109

ASP.NET MVC için doğrudan konuşamıyorum, ancak ASP.NET Web Formları için, hile bir kullanıcı oluşturmak FormsAuthenticationTicketve bir kez kimlik doğrulaması yapıldıktan sonra bir çereze şifrelemek. Bu şekilde, veritabanını yalnızca bir kez (veya kimlik doğrulamanızı gerçekleştirmek için AD veya kullandığınız her şeyi) çağırmanız gerekir ve sonraki her istek, çerezde saklanan bilete göre kimlik doğrulaması yapar.

Bununla ilgili iyi bir makale: http://www.ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html (bozuk bağlantı)

Düzenle:

Yukarıdaki bağlantı koptuğu için, yukarıdaki cevabında LukeP'nin çözümünü tavsiye ederim: https://stackoverflow.com/a/10524305 - Kabul edilen cevabın bu cevaba değiştirilmesini de öneririm.

Düzenleme 2: Bozuk bağlantı için bir alternatif: https://web.archive.org/web/20120422011422/http://ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html


PHP'den geliyor, her zaman UserID ve Oturumda sınırlı erişim vermek için gerekli diğer parçalar gibi bilgileri koydum. Müşteri tarafında saklamak beni sinirlendiriyor, bunun neden sorun olmayacağı hakkında yorum yapabilir misiniz?
John Zumbrum

@JohnZ - Bilet, kablo üzerinden gönderilmeden önce sunucuda şifrelenir, bu nedenle istemcinin bilet içinde depolanan verilere erişimi olacak gibi değildir. Oturum kimliklerinin bir çerezde de saklandığını unutmayın, bu yüzden gerçekten farklı değildir.
John Rasch

3
Buradaysanız LukeP'nin çözümüne
bakmalısınız

2
Bu yaklaşımla her zaman maksimum çerez boyutunu ( stackoverflow.com/questions/8706924/… ) aşma potansiyeli ile ilgileniyorum . Ben kullanma eğiliminde Cachebir şekilde Sessionsunucuda veri saklamak yerine. Birisi bunun kusurlu bir yaklaşım olup olmadığını söyleyebilir mi?
Red Taz

2
Güzel yaklaşım. Bununla ilgili olası bir sorun, kullanıcı nesnenizde birden fazla özellik varsa (ve özellikle herhangi bir iç içe nesne varsa), şifrelenmiş değer 4KB'nin üzerine çıktığında çerezin sessizce başarısız olacağıdır (vurmak çok daha kolay olabilir). Sadece önemli verileri depolarsanız sorun değil ama geri kalanı için DB'ye basmanız gerekir. Diğer bir husus, kullanıcı nesnesinde imza veya mantık değişikliği olduğunda çerez verilerini "yükseltmektir".
Geoffrey Hudik

63

İşte işi yapmak için bir örnek. bool isValid, bazı veri deposuna bakarak ayarlanır (kullanıcı veri tabanınızı varsayalım). UserID, benim koruduğum bir kimlik. Kullanıcı verilerine e-posta adresi gibi ek bilgiler ekleyebilirsiniz.

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 bilgilerinizi kurtarmak için aşağıdaki kodu ekleyin

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;
    }
}

Bilgileri daha sonra kullanacağınız zaman, özel yöneticinize aşağıdaki gibi erişebilirsiniz.

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

bu, özel kullanıcı bilgilerine erişmenizi sağlar.


2
FYI - bu Request.Cookies [] (çoğul)
Dan Esparza

10
Thread.CurrentPrincipal ve Context.User öğelerini CustomPrincipal olarak ayarlamayı unutmayın.
Russ Cam

6
GetUserIdentity () nereden geliyor?
Ryan

Yorumda da belirttiğim gibi, System.Web.Security.IIdentity'nin bir uygulamasını verir. Google, bu arayüz hakkında
Sriwantha Attanayake

16

MVC, denetleyici sınıflarınızdan takılan OnAuthorize yöntemini sağlar. Veya yetkilendirme gerçekleştirmek için özel bir eylem filtresi kullanabilirsiniz. MVC yapmayı oldukça kolaylaştırır. Burada bununla ilgili bir blog yazısı yayınladım. http://www.bradygaster.com/post/custom-authentication-with-mvc-3.0


Ancak oturum kaybedilebilir ve kullanıcı hala kimlik doğrulaması yapabilir. Hayır ?
Dragouf

@brady gaster, blog yayınınızı okudum (teşekkürler!), Neden biri diğeri tarafından belirtilen global.asax girişi "... AuthenticateRequest (..)" üzerinde yazdığınız gibi geçersiz kılma "OnAuthorize ()" kullansın? Yanıtlar? Kullanıcı prensibini belirlemede biri diğerine göre tercih edilir mi?
RayLoveless

10

Görüşlerinizde kullanmak için bazı yöntemleri @Kullanıcıya bağlamanız gerekirse bir çözüm. Herhangi bir ciddi üyelik özelleştirmesi için çözüm yoktur, ancak orijinal soru yalnızca görüşler için gerekliyse, bu belki de yeterli olacaktır. Aşağıda, bazı bağlantıların sunulup sunulmayacağını doğrulamak için kullanılan bir yetkilendirme filtresinden döndürülen bir değişkeni kontrol etmek için kullanıldı (herhangi bir yetkilendirme mantığı veya erişim izni için değil).

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Security.Principal;

    namespace SomeSite.Web.Helpers
    {
        public static class UserHelpers
        {
            public static bool IsEditor(this IPrincipal user)
            {
                return null; //Do some stuff
            }
        }
    }

Sonra web.config alanlarına bir referans ekleyin ve bunu görünümde aşağıdaki gibi çağırın.

@User.IsEditor()

1
Çözümünüzde, her seferinde yine veritabanı aramaları yapmamız gerekiyor. Çünkü kullanıcı nesnesinin özel özellikleri yoktur. Sadece Adı ve Yetkisi Var
oneNiceFriend

Bu tamamen uygulamanıza ve istenen davranışınıza bağlıdır. Örneğim 0 satır veritabanı veya rol mantığı içeriyor. Bir IsInRole kullanırsanız, ben de inanıyorum çerez önbelleğe olabilir. Veya kendi önbellek mantığınızı uygularsınız.
Base

3

LukeP'nin cevabına dayanarak, kurulum timeoutve requireSSLişbirliği için bazı yöntemler ekleyin Web.config.

Referans bağlantıları

LukeP'nin Değiştirilmiş Kodları

1, Set timeoutdayalı Web.Config. FormsAuthentication.Timeout web.config'de tanımlanan zaman aşımı değerini, alacak. Aşağıdakileri, geri dönen bir işlev olarak tamamladım ticket.

int version = 1;
DateTime now = DateTime.Now;

// respect to the `timeout` in Web.config.
TimeSpan timeout = FormsAuthentication.Timeout;
DateTime expire = now.Add(timeout);
bool isPersist = false;

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
     version,          
     name,
     now,
     expire,
     isPersist,
     userData);

2, yapılandırmaya dayalı olarak, çerez güvenli olup olmayacak şekilde RequireSSLyapılandırın.

HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
// respect to `RequreSSL` in `Web.Config`
bool bSSL = FormsAuthentication.RequireSSL;
faCookie.Secure = bSSL;

3

Pekala, bu yüzden bu çok eski soruyu sürükleyerek ciddi bir kripto paracısıyım, ancak yukarıdaki @Baserz tarafından ele alınan çok daha basit bir yaklaşım var. Ve bu C # Uzantı yöntemleri ve önbelleğe alma (oturum kullanmayın) bir arada kullanmaktır.

Aslında, Microsoft zaten Microsoft.AspNet.Identity.IdentityExtensionsad alanında bu tür uzantıları sağlamıştır . Örneğin GetUserId(), kullanıcı kimliğini döndüren bir uzantı yöntemidir. IPrincipal'e dayalı talepleri döndüren GetUserName()ve de vardır FindFirstValue().

Bu nedenle, yalnızca ad alanını eklemeniz ve ardından User.Identity.GetUserName()ASP.NET Identity tarafından yapılandırıldığı gibi kullanıcıların adını almak için arayın .

Eski ASP.NET Kimliği açık kaynaklı olmadığından ve tersine mühendislik yapma zahmetine girmediğinden, bu önbelleğe alınmış olup olmadığından emin değilim. Ancak, bu değilse, kendi uzatma yönteminizi yazabilirsiniz, bu da bu sonucu belirli bir süre için önbelleğe alır.


Neden "oturumu kullanma"?
Alex

@jitbit - çünkü oturum güvenilmez ve güvensizdir. Aynı nedenle oturumu asla güvenlik amacıyla kullanmamalısınız.
Erik Funkenbusch

"Güvenilmez" oturumu yeniden doldurmak suretiyle (boşsa) ele alınabilir. "Güvenli değil" - oturum ele geçirme işleminden korunmanın yolları vardır (yalnızca HTTPS + diğer yolları kullanarak). Ama aslında sana katılıyorum. Nerede önbelleğe alırsınız? Gibi Bilgi IsUserAdministratorveya UserEmailvs.? Düşünüyor HttpRuntime.Cachemusun?
Alex

@jitbit - Bu bir seçenek veya varsa başka bir önbellek çözümü. Bir süre sonra önbellek girdisinin süresinin dolduğundan emin olun. Güvenli olmayan şekilde yerel sistem için de geçerlidir, çünkü çerezi manuel olarak değiştirebilir ve oturum kimliklerini tahmin edebilirsiniz. Ortadaki adam tek endişe değil.
Erik Funkenbusch

2

Sayfalarınızın arkasındaki koddaki erişimi basitleştirmek istiyorsanız, Web Formları kullanıcıları için (MVC değil) LukeP koduna ek olarak, aşağıdaki kodu bir temel sayfaya ekleyin ve temel sayfayı tüm sayfalarınızda türetin:

Public Overridable Shadows ReadOnly Property User() As CustomPrincipal
    Get
        Return DirectCast(MyBase.User, CustomPrincipal)
    End Get
End Property

Böylece, arkadaki kodunuzda şunlara erişebilirsiniz:

User.FirstName or User.LastName

Ben bir Web Form senaryosunda eksik ne de örneğin, sayfanın bağlı olmayan kodda aynı davranışı elde etmek nasıl Httpmodules Hep her sınıfta bir atması eklemek gerekir ya bu elde etmek için bir akıllı yolu var mı?

Benim özel kullanıcı için bir temel olarak örnekler kullanılan beri cevaplar ve için teşekkürler LukeP teşekkür (şimdi olan User.Roles, User.Tasks, User.HasPath(int), User.Settings.Timeoutve diğer birçok güzel şeyler)


0

LukeP tarafından önerilen çözümü denedim ve Yetkilendirme özelliğini desteklemediğini buldum. Bu yüzden biraz değiştirdim.

public class UserExBusinessInfo
{
    public int BusinessID { get; set; }
    public string Name { get; set; }
}

public class UserExInfo
{
    public IEnumerable<UserExBusinessInfo> BusinessInfo { get; set; }
    public int? CurrentBusinessID { get; set; }
}

public class PrincipalEx : ClaimsPrincipal
{
    private readonly UserExInfo userExInfo;
    public UserExInfo UserExInfo => userExInfo;

    public PrincipalEx(IPrincipal baseModel, UserExInfo userExInfo)
        : base(baseModel)
    {
        this.userExInfo = userExInfo;
    }
}

public class PrincipalExSerializeModel
{
    public UserExInfo UserExInfo { get; set; }
}

public static class IPrincipalHelpers
{
    public static UserExInfo ExInfo(this IPrincipal @this) => (@this as PrincipalEx)?.UserExInfo;
}


    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginModel details, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            AppUser user = await UserManager.FindAsync(details.Name, details.Password);

            if (user == null)
            {
                ModelState.AddModelError("", "Invalid name or password.");
            }
            else
            {
                ClaimsIdentity ident = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
                AuthManager.SignOut();
                AuthManager.SignIn(new AuthenticationProperties { IsPersistent = false }, ident);

                user.LastLoginDate = DateTime.UtcNow;
                await UserManager.UpdateAsync(user);

                PrincipalExSerializeModel serializeModel = new PrincipalExSerializeModel();
                serializeModel.UserExInfo = new UserExInfo()
                {
                    BusinessInfo = await
                        db.Businesses
                        .Where(b => user.Id.Equals(b.AspNetUserID))
                        .Select(b => new UserExBusinessInfo { BusinessID = b.BusinessID, Name = b.Name })
                        .ToListAsync()
                };

                JavaScriptSerializer serializer = new JavaScriptSerializer();

                string userData = serializer.Serialize(serializeModel);

                FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                         1,
                         details.Name,
                         DateTime.Now,
                         DateTime.Now.AddMinutes(15),
                         false,
                         userData);

                string encTicket = FormsAuthentication.Encrypt(authTicket);
                HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
                Response.Cookies.Add(faCookie);

                return RedirectToLocal(returnUrl);
            }
        }
        return View(details);
    }

Ve son olarak Global.asax.cs içinde

    protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            PrincipalExSerializeModel serializeModel = serializer.Deserialize<PrincipalExSerializeModel>(authTicket.UserData);
            PrincipalEx newUser = new PrincipalEx(HttpContext.Current.User, serializeModel.UserExInfo);
            HttpContext.Current.User = newUser;
        }
    }

Şimdi görünümler ve denetleyicilerdeki verilere yalnızca arayarak erişebilirim

User.ExInfo()

Oturumu kapatmak için sadece ararım

AuthManager.SignOut();

AuthManager nerede

HttpContext.GetOwinContext().Authentication
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.