Защита WebApi с использованием open ID Connect - PullRequest
0 голосов
/ 12 марта 2019

У меня возникла проблема при попытке защитить службу веб-API с помощью OpenId connect и ADFS 2016.

У меня есть собственный мобильный клиент, который успешно получает токен доступа, обновления и Id из ADFS после ввода их учетных данных на странице входа в систему.

Однако, когда я использую этот токен для доступа к своему простому методу веб-API, он всегда отображает страницу входа

Вот мой Startup.cs

public partial class Startup
{
        public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            var cookieAuthenticationOptions = new CookieAuthenticationOptions();
            app.UseCookieAuthentication(cookieAuthenticationOptions);



            var openIdConnectAuthenticationOptions = new OpenIdConnectAuthenticationOptions
            {
                ClientId = "**<myclientid>**",
                MetadataAddress = "https://**<myFullyQualifiedDomainName>**/adfs/.well-known/openid-configuration",
                PostLogoutRedirectUri = "my.client.native://callback",
                RedirectUri = "my.client.native://callback",
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    RedirectToIdentityProvider = (context) =>
                    {
                        Debug.WriteLine("*** RedirectToIdentityProvider");
                        return Task.FromResult(0);
                    },
                    MessageReceived = (context) =>
                    {
                        Debug.WriteLine("*** MessageReceived");
                        return Task.FromResult(0);
                    },
                    SecurityTokenReceived = (context) =>
                    {
                        Debug.WriteLine("*** SecurityTokenReceived");
                        return Task.FromResult(0);
                    },
                    SecurityTokenValidated = (context) =>
                    {
                        Debug.WriteLine("*** SecurityTokenValidated");
                        return Task.FromResult(0);
                    },
                    AuthorizationCodeReceived = (context) =>
                    {
                        Debug.WriteLine("*** AuthorizationCodeReceived");
                        return Task.FromResult(0);
                    },
                    AuthenticationFailed = (context) =>
                    {
                        Debug.WriteLine("*** AuthenticationFailed");
                        return Task.FromResult(0);
                    }

                }
            };

            app.UseOpenIdConnectAuthentication(openIdConnectAuthenticationOptions);


        }
    }

Когда я вызываю мой метод GET Web API, я вижу уведомление об опциях открытого идентификатора для RedirectToIdentifyProvider в отладчике, ни одно из других уведомлений не срабатывает. Я предполагаю, что в этот момент было решено, что страница входа должна быть представлена ​​снова. В ответ на мой HTTP GET я получаю HTML-код страницы входа в ADFS.

У кого-нибудь есть идеи о том, как заставить это работать с нативным клиентом, пытающимся получить доступ к методу сервиса webapi? Насколько я могу сказать, это правильно. Моя проблема заключается в том, что большинство примеров для веб-страницы, доступ к веб-API. Я не уверен в настройке типа аутентификации для использования куки. Это правильно?

Также следует использовать app.UseOpenIdConnectAuthentication для собственного клиента или использовать другое промежуточное ПО OWIN.

Буду признателен за любой вклад, поскольку я потратил много времени, пытаясь выяснить, что не так.

Заранее спасибо.

1 Ответ

0 голосов
/ 13 марта 2019

После еще одного дня исследования я решил проблему, кажется, что использование app.UseOpenIdConnectAuthentication не подходит для нативных клиентов adfs.Я считаю, что это должно использоваться для пассивных клиентов, таких как веб-страница.

Вместо этого следующий код должен использоваться для активных клиентов, таких как мобильные или настольные приложения

    app.UseActiveDirectoryFederationServicesBearerAuthentication(
        new ActiveDirectoryFederationServicesBearerAuthenticationOptions
        {
            MetadataEndpoint = https://AdfsServerFullyQualifiedDomainName>/federationmetadata/2007-06/federationmetadata.xml,
                    TokenValidationParameters = new TokenValidationParameters()
                    {
                        ValidAudience = "<web api replying party url configured in ADFS>"
                    },

                });
...