2017-09-18 34 views
5

Używam poniższy kod do uwierzytelniania w ASP.NET 2.0 z wykorzystaniem rdzenia ciasteczkaNie authenticationScheme został określony, i nie było DefaultChallengeScheme znaleźć uwierzytelniania Cookies

services 
    .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) 
    .AddCookie("MyCookieMiddlewareInstance", options => 
    { 
     options.AccessDeniedPath = new PathString("/Account/Login"); 
     options.LoginPath = new PathString("/Account/Login"); 
     options.LogoutPath = new PathString("/Account/LogOff"); 
    }); 

ja otrzymuję błąd jako „Nie było authenticationScheme . określony, a nie znaleziono żadnych wiadomości DefaultChallengeScheme”

konfiguracja cookie jest poniżej:

var claims = new List<Claim> 
{ 
    new Claim(ClaimTypes.NameIdentifier, userId.ToString()), 
    new Claim(ClaimTypes.Name, userName) 
}; 

var identity = new ClaimsIdentity(claims, "Forms"); 
identity.AddClaim(new Claim(ClaimTypes.Role, "ADMIN")); 
var principal = new ClaimsPrincipal(identity); 
HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal, new AuthenticationProperties 
{ 
    IsPersistent = isPersistent, 
    ExpiresUtc = DateTime.UtcNow.AddYears(1) 
}); 

Zrobiłem trochę badań i nie znalazłem rozwiązania. Oto link, którego użyłem: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x

Czy ktoś może dać mi znać, w jaki sposób mogę rozwiązać ten problem?

+1

Prawdopodobny duplikat oprogramowania pośredniczącego do uwierzytelniania ASP.NET Core 2.0] (https://stackoverflow.com/questions/ 45805411/middle-core-2-0-authentication-middleware) –

Odpowiedz

-1

HttpContext.Authentication jest przestarzała ASP.net rdzenia 2.0 Zamiast HttpContext.Authentication.SignInAsync zastosowanie HttpContext.SignInAsync

+0

Prawda, ale bardzo nieistotna dla problemu OP. Przestarzałe też nie znaczy, że przestało działać. – poke

+0

O ile pamiętam, zaczyna się dla mnie praca po tej zmianie. – YuriyP

2
authenticationBuilder.AddCookie("MyCookieMiddlewareInstance", …) 

ten rejestruje obsługi uwierzytelniania ciastko z wykorzystaniem uwierzytelnienia nazwę schemat "MyCookieMiddlewareInstance". Tak więc, gdy odwołujesz się do schematu uwierzytelniania plików cookie, musisz użyć tej dokładnej nazwy, w przeciwnym razie nie znajdziesz tego schematu.

Jednak w zaproszeniu AddAuthentication, używasz innej nazwy schematu:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) 

ten rejestruje CookieAuthenticationDefaults.AuthenticationScheme, który ma wartość stałą "Cookies", jak system uwierzytelniania domyślnym. Ale schemat o tej nazwie nigdy nie jest zarejestrowany! Zamiast tego jest tylko "MyCookieMiddlewareInstance".

Rozwiązaniem jest po prostu użycie tej samej nazwy dla obu połączeń. Możesz także po prostu użyć wartości domyślnych i usunąć jawne nazwy; jeśli nie masz wielu schematów i potrzebujesz większej kontroli, nie ma potrzeby jawnego ustawiania ich nazw.

0

Dla tych, którzy lądują na to i opuścić sfrustrowany, moja rada jest spojrzeć na odpowiedź na to pytanie: ASP.NET Core 2.0 authentication middleware

bez ponownego iteracji czego tam znaleźć zbyt dużo wydaje ten problem jest związany z zmiany w zabezpieczeniach między ASP.Net Core 1 i 2. Oczywiście, porady tam rozwiązały moje własne problemy. Warto również rzucić okiem na ten wpis na blogu: https://ignas.me/tech/custom-authentication-asp-net-core-20/ (podejrzewam, że został napisany w oparciu o tę odpowiedź SO)

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/18085439) –

+0

Jeśli masz na myśli link, odpowiedź SO, która prawdopodobnie będzie żyć tak długo, jak SO? Z przyjemnością usunę link do posta na blogu; jest to przede wszystkim powtórzenie odpowiedzi SO, więc nie dodaje wiele. Ale prawdopodobnie też nie zaszkodzi. –

+0

Niezupełnie, jeśli zawartość SO na tym anserze ulegnie zmianie, to ta odpowiedź nie jest już ważna.Zazwyczaj możesz pozostawić linki, ale skopiuj istotne części z linku, który pozostanie tutaj, jeśli zawartość linków się zmieni. –

Powiązane problemy