2014-04-10 12 views
6

Bu değeri Request.Url'den veya veritabanımda saklanan bazı ayarlardan almak istiyorsam CookieAuthenticationOptions'ta CookieDOmain'i çalışma zamanında nasıl ayarlayabilirim?Asp.Net Identity - Çalışma zamanında CookieDomain ayarı

Alt etki alanlarını desteklemek istiyorum, ancak bunların her biri farklı etki alanlarına sahip olan çoklu kiracıları da destekliyorum.

Yapılandırılmakta olan şu anda bunlardan herhangi birine erişimim yok.

Paul

cevap

10

Kendi çerez sağlayıcı atayabilirsiniz:

public class CookieAuthProvider : CookieAuthenticationProvider 
{ 
    public override void ResponseSignIn(CookieResponseSignInContext context) 
    { 
     //Alter you cookie options 
     //context.CookieOptions.Domain = "www...";  
     base.ResponseSignIn(context); 
    } 
} 

ResponseSignIn'u uygulayın ve bir uç noktaya, bir çereze dönüştürülmeden önce bilgi girişi sağladığında çağrılır. Bu yöntemi uygulayarak bilete giren iddialar ve ekstra bilgiler değiştirilebilir.

ResponseSignIn çağrısı sırasında değiştirilebilen veya değiştirilebilen CookieOptions özelliğini gösteren bir CookieResponseSignInContext geçireceksiniz. Katana projesinden

Kod referanslar:

+1

Belirtilen kod, Owin 3.0.0-beta2-30422-012-dev tabanlıdır, daha eski bir sürümü kullanıyorsanız değiştirmeniz gerekebilir. –

+0

Bunu denedim ama SignOut'un çalışmayı durdurduğunu gördüm. Düşüncesi olan var mı? –

+1

Net, beni aldatmasın. "CookieOptions" özelliğini bulamazsanız, bunun yerine bir 'Seçenekler 'özelliği bulursanız, kullanmayı deneyin, bu yanıt üzerinde yazım hatası olduğuna inanmayın. Durum böyle değil. CookieOptions özelliği yoksa, Microsoft.Owin.Security.Cookies başvurunuzu güncelleştirmeniz gerekir.'Seçenekler' özelliğine yapılan doğrudan değişiklikler, sonraki istekler için yönetici seçeneklerini değiştirdiğinden hatalara yol açar, ancak geçerli olanı değil! "CookieOptions" özelliğindeki değişiklikler geçerli istek ve yalnızca bunun için geçerlidir. –

3

Zaten bu deneyin:

CookieAuthProvider myProvider = new CookieAuthProvider(); 
app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/Account/Login"), 
    Provider = myProvider 
}); 

Ya kendi uygulamak, ya da sadece mevcut sağlayıcıdan devralan:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = "Application", 
    LoginPath = "/Account/Login", 
    CookieDomain = ".myDomain.com" 
}); 
+1

OP sabit dinamik bunu yapmak istediği değil, görünüyor Önceden bilinen değer/geliştiricinin yeni bir etki alanına dağıtmak için değişiklik gerektirmemesi. – pwdst

1

O MK benziyor. yanıt, SlidingExpiration seçeneği kullanıldığında jeton yenilemenin doğru şekilde ele alınmasına izin vermez. Bir geçici çözüm olarak, özel bir çerez sağlayıcısı yerine, özel bir çerez yöneticisi sağlayabileceğiniz ve tanımlama bilgisi eklemek/çıkarmak için kendi yöntemlerinizi tanımlayabileceğiniz anlaşılır.

Durumumda bunu basitleştirmek için, başlık altındaki varsayılan çerez yöneticisini tekrar kullanıyorum. (Ben onun yöntemleri geçersiz kılınabilir değildir, bunu uzatmak olamaz.) İşte

ben ile sona erdi kodudur:

using Microsoft.AspNet.Identity; 
using Microsoft.Owin; 
using Microsoft.Owin.Infrastructure; 
using Microsoft.Owin.Security.Cookies; 
using Microsoft.Owin.Security.DataProtection; 
using Owin; 

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var options = new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      SlidingExpiration = true, 
      CookieManager = new CustomCookieManager() 
     }; 

     app.UseCookieAuthentication(options); 
    } 
} 

public class CustomCookieManager : ICookieManager 
{ 
    private readonly ICookieManager ConcreteManager; 

    public CustomCookieManager() 
    { 
     ConcreteManager = new ChunkingCookieManager(); 
    } 

    string ICookieManager.GetRequestCookie(IOwinContext context, string key) 
    { 
     return ConcreteManager.GetRequestCookie(context, key); 
    } 

    void ICookieManager.AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) 
    { 
     SetupDomain(context, options); 
     ConcreteManager.AppendResponseCookie(context, key, value, options); 
    } 

    void ICookieManager.DeleteCookie(IOwinContext context, string key, CookieOptions options) 
    { 
     SetupDomain(context, options); 
     ConcreteManager.DeleteCookie(context, key, options); 
    } 

    private void SetupDomain(IOwinContext context, CookieOptions options) 
    { 
     // custom logic for assigning something to options.Domain 
    } 
} 
İlgili konular