Расширение IPrincipal в .NET Core 2.1 с проверкой подлинности Windows - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь расширить IPrincipal в .NET Core с аутентификацией Windows.

В предыдущем проекте (с использованием .NET Framework 4.6.1) на Application_Start() Я добавил приведенный ниже код для расширенияIPrincipal:

protected void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e)
{
    if (e.Identity != null && e.Identity.IsAuthenticated)
    {
        NgUser opPrincipal = CustomStaticMethod.GetUserAD();
        HttpContext.Current.User = opPrincipal;
     }
 }

И это мой пользовательский класс

public class NgUser : IPrincipal
{
    // code removed for abbr ...
}

Затем каждый раз, когда в контроллере происходит преобразование HttpContext.Current.User в CustomPrincipal, у меня будет доступ к пользовательскому классу.свойства без необходимости использования утверждений или использования статических расширений или сохранения объекта в сеансе.

Теперь в .NET Core я видел, что вы можете настроить преобразование утверждений , и я также прочитал this и они в основном расширены IPrincipal.

Я бы предпочел расширить IPrincipal с помощью моего пользовательского класса, зарегистрировать его в Startup.cs и иметь возможность доступа к нему в моих контроллерах.

Конечно, это выполнимо, вопрос в том, как?

Надеюсь, это понятно, и кто-то может мне помочь.Большое спасибо

1 Ответ

0 голосов
/ 07 декабря 2018

Это очень выполнимо.Самый простой способ - добавить часть промежуточного программного обеспечения, которое ведет себя подобно OnAuthenticate, к конвейеру Configure() в .NET Core.Здесь вы поменяете IPrincipal.Обратите внимание, что это работает только в том случае, если веб-приложение настроено для работы с проверкой подлинности Windows только в IIS / IIS Express.Анонимная аутентификация добавляет дополнительные издержки.

Если у вас есть эта простая установка Win auth, в вашем Startup.cs поместите это в верхней части вашего Configure(IApplicationBuilder app) метода:

// Because IIS automatically captures the user login, by the time the app is touched
// in any request, the context (ctx) User is already present.
app.Use(async (ctx, next) =>
{
  if (ctx.User?.Identity?.IsAuthenticated == true)
  {
    NgUser opPrincipal = CustomStaticMethod.GetUserAD();
    ctx.User = opPrincipal;
  }

  // be sure to continue the rest of the pipeline!
  await next.Invoke();
});

`` `

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...