2017-07-25 17 views
2

Ich entwickle eine Anwendung mit ASP.NET Core und ich benutze eine benutzerdefinierte Cookie-Authentifizierung. Meine CookieAuthenticationOptions sind:ASP.NET Core Authentifizierung Cookie nur einmal empfangen

app.UseCookieAuthentication(new CookieAuthenticationOptions() 
{ 
    AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme, 
    LoginPath = new PathString("/login"), 
    AccessDeniedPath = new PathString("/unauthorized/"), 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true 
}); 

Das Cookie einfach gut angelegt, und ich kann es in den Browser-Einstellungen während der gesamten Zeit sehe ich die Anwendung leite. Das ist meine HomeController Klasse:

public HomeController(IHostingEnvironment env, 
    IAntiforgery antiforgery, 
    IOptions<AppSettings> appSettings, 
    TerminalDbContext terminalContext, 
    ILoggerFactory loggerFactory, 
    IHttpContextAccessor _httpContextAccessor) 
{ 
    _env = env; 
    _antiforgery = antiforgery; 
    _appSettings = appSettings; 
    _terminalContext = terminalContext; 
    _logger = loggerFactory.CreateLogger<HomeController>(); 
    _httpContext = _httpContextAccessor.HttpContext; 


    _logger.LogInformation("Cookie coming"); 
    var cookies = _httpContext.Request.Cookies[".AspNetCore.Cookies"]; 
    if (cookies != null) 
    { 
     _logger.LogInformation(cookies.Length.ToString()); 
     _logger.LogInformation(cookies.ToString()); 
    } 
    else 
    { 
    _logger.LogInformation("THE COOKIE IS NULL"); 
    } 
} 

Und das ist, wie ich in den User an:

var claims = new List<Claim> 
    { 
     new Claim(ClaimTypes.Name, loginInfo.Username), 
     new Claim("DbName", loginInfo.Terminal.SesamDbName), 
    }; 

var userIdentity = new ClaimsIdentity(claims, "password"); 

ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity); 
await _httpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal); 

ich die Anwendung leite und mehr Instanzen der HomeController erstellt werden, da ich HttpGet habe Methoden, die eine JsonResult zurückgeben, die für die Ansicht benötigt wird.

Wenn die Anwendung zum ersten Mal versucht, [Authorize] (für die Index()-Methode), findet es den Cookie und authentifiziert und autorisiert fein. Das zweite Mal versucht es [Authorize] (für eine HttpGet Methode, die eine JsonResult zurückgibt) es findet den Cookie nicht, obwohl es dort in den Einstellungen meines Browsers ist. Dies ist das Protokoll, das ich erhalte, um dies zu veranschaulichen:

... 
info: Server.Controllers.HomeController[0] 
     Cookie coming 
info: Server.Controllers.HomeController[0] 
     347 
info: Server.Controllers.HomeController[0] 
    CfDJ8GSLZENXaNpNrtmz2DAt9joqJ6CEHpCFbJdbNxbQYjjoQmd4naOI0L0krNMSQdVhqPRP9tJJMMIRayc5ILRQMcJQWNZ0T9Fjuk7Qxg65wPP7SR43UZxwy6vGQ7_qeSp44gYLLe4NGEalhXynZxmD-jywqL4VJZ5y4OwpsEKLx-VVT03xAlt54J_qQk_O4wjwLQiZBpAVTFKUWN4u7H8yd_rwMTIGBPu21t5n35To9bTQU5677xNxiEFap3ukuxO4p-OxVakXqShy2Xk_vYDAvv_XFV6jgNcy4ZiCRB8VUhXGcNr205h4X0-O7JHB8mYbc13aZLmrAwvG5DWTBd3_OCo 
... 
info: Server.Controllers.HomeController[0] 
     Cookie coming 
info: Server.Controllers.HomeController[0] 
     THE COOKIE IS NULL 

Warum passiert das? Was kann ich tun?

+1

Sind Sie sicher, dass Sie die Anfrage über HTTPS in beiden Fällen stellen? –

+0

Wie überprüfe ich das? –

+0

Ich habe herausgefunden, was das Problem war, danke für die Hilfe, ich werde bald eine Antwort posten. –

Antwort

1

Das Problem hatte nichts mit dem Backend zu tun. Ich verwende React im Front-End und das Problem war, dass fetch() die Cookies nicht an das Back-End für die GET Methoden weitergegeben hat. Ich musste einfach { credentials: 'same-origin' } auf fetch() setzen, um die Cookies mit der Anfrage zu senden. Danke für die Hilfe.

Verwandte Themen