Я пытаюсь создать новую систему входа в систему для некоторых унаследованных приложений, которые используют проверку подлинности на основе форм для обеспечения своей безопасности. Новая система входа в систему использует ядро ASP.NET.
Насколько я могу судить, новая система входа в систему работает. Конечным результатом является перенаправление на нужную страницу с файлом cookie .ASPXAUTH. IIS не любит куки, хотя. Он всегда перенаправляет обратно на страницу входа.
Я проверил путь печенья и продолжительность жизни, и они хороши. Я написал HttpModule для регистрации того, что происходит в IIS, и похоже, что содержимое cookie недействительно. Когда я пытаюсь расшифровать содержимое с помощью FormsAuthentication.Decrypt, выдается исключение: «Недопустимое значение для параметра« encryptedTicket ».»
Я настраиваю аутентификацию на сервисе регистрации следующим образом:
services.
AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = IISDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.Cookie.Name = ".ASPXAUTH";
options.Cookie.Path = "/";
options.Cookie.MaxAge = System.TimeSpan.FromDays(1);
})
Это то, что я использую для создания тикета форм в сервисе входа в систему:
var claims = new Claim[] { new Claim(ClaimTypes.Name, userId) };
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var properties = new AuthenticationProperties
{
IsPersistent = true,
RedirectUri = returnUrl,
};
HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(identity),
properties).Wait();
Чтобы попробовать и проверить тикет в HttpModule, я сделал это:
string aspxauth = null;
try
{
aspxauth = application.Context.Request.Cookies[".ASPXAUTH"].Value;
writer.WriteLine($"\t.ASPXAUTH: {aspxauth}");
}
catch (Exception ex)
{
writer.WriteLine($"\tERROR: The .ASPXAUTH cookie could not be read: {ex.Message}");
return;
}
Есть идеи, почему IIS не может расшифровать мои билеты?