2014-04-10 10 views
6

Jak ustawić wartość CookieDOmain w pliku CookieAuthenticationOptions w środowisku wykonawczym, jeśli chcę pobrać tę wartość z pliku Request.Url lub niektórych ustawień przechowywanych w mojej bazie danych?Identyfikacja Asp.Net - Ustawianie pliku CookieDomain w czasie wykonywania

Chcę obsługiwać subdomeny, ale również wspierać wielu dzierżawców, z których każdy ma inne domeny.

W tej konfiguracji nie mam dostępu do żadnego z nich.

Paul

Odpowiedz

10

można przypisać własny dostawcy cookies:

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

Albo zaimplementować własną, lub po prostu dziedziczą z istniejącego operatora:

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

I implementuj ResponseSignIn, jest wywoływana, gdy punkt końcowy podał informacje logowania, zanim zostanie przekształcony w plik cookie. Dzięki wdrożeniu tej metody roszczenia i dodatkowe informacje, które trafiają do biletu, mogą zostać zmienione.

Zostanie przekazany CookieResponseSignInContext, który udostępnia właściwość CookieOptions, którą można wymienić lub zmienić podczas wywołania ResponseSignIn.

referencje kod z projektu Katana:

+1

Wymieniony kod jest oparty na Owin 3.0.0-beta2-30422-012-dev, może być konieczna modyfikacja, jeśli używasz wcześniejszej wersji. –

+0

Próbowałem tego, ale stwierdziłem, że SignOut przestał działać. jakieś pomysły? –

+1

Czy sieć jest oszukana jak ja. Jeśli nie znajdziesz właściwości 'CookieOptions', ale zamiast tego znajdujesz właściwość' Options', nie próbuj jej używać, sądząc, że w tej odpowiedzi jest literówka. Tak nie jest. Jeśli nie masz właściwości 'CookieOptions', musisz zaktualizować swoje odniesienie do Microsoft.Owin.Security.Cookies.Bezpośrednie zmiany na właściwość 'Options' prowadzą do błędów, ponieważ zmieniają opcje menedżera dla kolejnych żądań, ale nie dla bieżącego! Zmiany w właściwości 'CookieOptions' mają zastosowanie do bieżącego żądania i tylko do niego. –

3

Czy już spróbuj tego:

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

Wydaje się, że PO chce to zrobić dynamicznie, a nie ze stałym wartość znana z góry/niewymagająca zmian przez programistę do wdrożenia w nowej domenie. – pwdst

1

Wygląda MK. Odpowiedź nie pozwala na poprawną obsługę odnawiania tokena podczas korzystania z opcji SlidingExpiration.

Jako rozwiązanie alternatywne, zamiast dostarczać niestandardowego dostawcę plików cookie, wydaje się, że można podać niestandardowego menedżera plików cookie i zdefiniować własne metody dodawania/usuwania pliku cookie.

Aby zachować prostotę w moim przypadku, ponownie używam domyślnego menedżera plików cookie pod maską. (Nie mogę przedłużyć go, jego metody nie są przeciążać.)

Oto kod I skończył z:

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