WS-Federation с OWIN в веб-формах ASP.NET

Я хочу использовать WSFederation с OWIN в приложении WebForms. Несмотря на то, что я запрещаю несанкционированный доступ в web.config с помощью тега <authorization> на всех моих страницах, приложение не перенаправляет автоматически на IDP.

Приложение автоматически перенаправляет на страницу входа в систему в случае CookieAuthentication MW, но не делает этого в случае WS-FederationAuth MW.

То же самое работает в MVC. В приложении MVC при украшении моего действия атрибутом [Authorize] приложение автоматически перенаправляется на IDP даже при использовании WS-FederationAuth MW.

Можно ли преобразовать 401 в 302 в WebForms?

Мой образец кода:

  public void ConfigureAuth(IAppBuilder app)
    {

 app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {
            AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType

        });

        app.UseWsFederationAuthentication(
                new WsFederationAuthenticationOptions
                {
                    Wtrealm = "http://localhost:53785/",
                    MetadataAddress = metatdataaddress,
                }
            );
        }

person DotnetCoE    schedule 19.02.2016    source источник


Ответы (1)


В приложении WebForms у вас нет никаких атрибутов OWin, таких как [Authorize], которые могут указать промежуточному программному обеспечению аутентификации Owin запросить (перенаправить) вашего провайдера аутентификации. Однако это легко решить.

Сначала добавьте промежуточное ПО, которое проверяет, аутентифицирована ли ваша личность, если не принудительно перенаправить вызов:

 app.Use((context, next) =>
{
    if (context.Authentication.User != null &&
        context.Authentication.User.Identity != null &&
        context.Authentication.User.Identity.IsAuthenticated)
    {
        return next();
    }
    else
    {
        // redirects to your provider
        context.Authentication.Challenge(authenticationTypes);
        return Task.FromResult(0);
    }
});
// note that it has to run in the right stage
app.UseStageMarker(PipelineStage.Authenticate)

Затем, если вы используете аутентификацию с помощью файлов cookie, она должна быть установлена ​​по умолчанию. Это означает, что «Если вы найдете файл cookie, доверяйте ему, пока он действителен, вместо перенаправления поставщику WsFed»

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

Теперь, когда вы возвращаетесь от вашего поставщика WsFed, этот файл cookie необходимо установить. В случае WebForms это обычно нужно делать вручную, используя уведомление на вашем промежуточном программном обеспечении. Мой опыт показывает, что .SignIn () недостаточно, чтобы отметить, что мы прошли аутентификацию, поэтому мы фактически повторно устанавливаем билет аутентификации:

new WsFederationAuthenticationOptions
{
  Notifications = new WsFederationAuthenticationNotifications
  {
      SecurityTokenValidated = (notification) =>
      {
         var identity = notification.AuthenticationTicket.Identity;
         var defaultName = identity.FindFirst("<claim-that-identifies-user>");

         // Forcefully set a cookie so that the WsFed provider does not have to be consulted on every request as long as this cookie is valid

var ticket = new AuthenticationTicket(response.AuthenticationTicket.Identity, response.AuthenticationTicket.Properties);
            var currentUtc = new SystemClock().UtcNow;
            ticket.Properties.IssuedUtc = currentUtc;
            ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(1));
            response.AuthenticationTicket = ticket;
            response.OwinContext.Authentication.SignIn(new AuthenticationProperties(), response.AuthenticationTicket.Identity);


         // context.Authentication.User.Identity.IsAuthenticated will now be true

         return Task.FromResult(notification);
      }
   },
person Johan O    schedule 06.07.2016
comment
Йохан - в приведенном выше коде Task.FromResult сообщает мне, что задача не содержит определения FromResult. Что я могу изменить на .net 4.61? Кроме того, что является объектом ответа в уведомлении? - person user1202839; 28.10.2017