- Я пытаюсь перенести приложение из Asp. net 4.7.1 в Asp. net core 3.1.
- Это приложение Web Api.
- У нас есть третья часть для аутентификации, которая создает повара ie (домен) с идентификатором сессии.
- раньше я использовал «IAuthenticationFilter», чтобы проверить, присутствует ли cook ie => no: return 401 => yes: взять идентификатор сессии, вызвать третью часть, чтобы получить имя пользователя; используйте имя пользователя для получения дополнительной информации в БД и установки объекта в моем контроллере (все мои контроллеры наследуются от пользовательского абстрактного контроллера).
- этот фильтр добавлен в "config.Filters.Add".
Теперь я пытаюсь выполнить "тот же" процесс в. Net Ядро, но все методы, которые я пробую, не сработали.
Я читал много сайтов, MS Docs et c. и я знаю, что этот процесс сильно отличается в Net ядре. Можете ли вы объяснить, как я могу перенести эту часть моего кода?
спасибо
Обновление:
К вашему сведению: сначала мы перенесем все приложения со старой аутентификацией система (с третьей частью), и когда все приложение будет готово, мы перейдем на ADFS и OpenId connect).
Мой класс для миграции
public class InitializeApplicationContextFilterAttribute : Attribute, IAuthenticationFilter
{
public bool AllowMultiple => false;
public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
// skip the auth if attribute is present
if (context.ActionContext.ActionDescriptor.GetCustomAttributes<DoNotCheckAuthFilterAttribute>().Any())
{
return;
}
// the action must be part of a controller inherit from CommonController
if (!(context.ActionContext.ControllerContext.Controller is CommonController controller))
{
LogHelpers.AddLog(null, LogLevelEnum.High, LogTypeEnum.Exception, MessageTypeEnum.Text, $"the controller don't inherit from CommonController");
return;
}
var cookie = context.Request.Headers.GetCookies(GlobalConst.OpenSSOCookieName).SingleOrDefault();
if (cookie != null)
{
var sessionId = cookie.Cookies.Single(o => o.Name == GlobalConst.OpenSSOCookieName).Value;
var checkResult = await new SSOHttpClient().CheckSession(sessionId);
// if session exist
if (checkResult?.Code == 1)
{
// for the moment, LeG read & write WS create data with user and auth. In other WS only read value (in futur version, all WS must be independant)
await AddDataInSSOSession(context, cancellationToken, controller, sessionId, checkResult);
// init app context with user store in SSO
controller.InitializeAppContext(await SSOHelper.GetUser(sessionId));
SetCookies(controller.AppContext, context.Request.Headers.GetCookies());
}
else
{
LogHelpers.AddLogAuthenticate401Action($"Session timeout session id {sessionId} ; checkResult is null {checkResult == null}");
context.ErrorResult = new UnauthorizedResult(Enumerable.Empty<AuthenticationHeaderValue>(), context.Request);
}
}
else
{
LogHelpers.AddLogAuthenticate401Action($"User unkwon, it must be logon");
context.ErrorResult = new UnauthorizedResult(Enumerable.Empty<AuthenticationHeaderValue>(), context.Request);
}
await Task.Yield(); // use to suppress warning CS1998
}