В настоящее время мы создаем пробное концептуальное приложение с ASP.NET Core 1.1. Цель состоит в том, чтобы обеспечить единый вход на уровне интрасети и предложить страницу входа для доступа через Интернет.
Пока я могу получить билет Kerberos, установив "windowsAuthentication": true
в настройках IIS (launchSettings.json) соответственно web.config.
Я создаю свое собственное промежуточное ПО аутентификации / обработчик аутентификации, чтобы продолжить.
Если пользователь еще не аутентифицирован, я перенаправляю его на страницу входа.
НО вот моя проблема. Первый запрос всегда нулевой, затем сервер вызывает Kerberos и получает билет. (Могу ли я упустить понимание того, как на самом деле работает Kerberos и сложные задачи)
В моей функции HandleUnauthorizedAsync
я не могу знать, отвечает ли IIS на билет или нет, и поэтому перенаправляю их до того, как ответ придет от IIS.
Кто-нибудь пробовал что-то подобное или знает, как решить проблему?
С уважением
Изменить. Имейте в виду, что в настоящее время это предназначено только для проверки концепции и тестирования.
Хендлеаутентатеасинк:
if(Context.User?.Identity?.AuthenticationType == "Kerberos") {
var identity = new ClaimsIdentity(new GenericIdentity(Context.User.Identity.Name, AeroAuthenticationOptions.DefaultSchemaName), new Claim[] {
// get claims from claim store
});
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, new Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties { }, AeroAuthenticationOptions.DefaultSchemaName);
return AuthenticateResult.Success(ticket);
}
return AuthenticateResult.Skip();
HandleUnauthorizedAsync:
if(context == null) {
throw new ArgumentNullException(nameof(context));
}
var properties = new AuthenticationProperties(context.Properties);
var redirectUri = properties.RedirectUri;
if(string.IsNullOrEmpty(redirectUri)) {
redirectUri = OriginalPathBase + Request.Path + Request.QueryString;
}
var loginUri = Options.LoginPath + QueryString.Create(Options.ReturnUrlParameter, redirectUri);
var redirectContext = new AeroCookieRedirectContext(Context, Options, BuildRedirectUri(loginUri), properties);
await Options.Events.RedirectToLogin(redirectContext);
return true;