Как получить токен на предъявителя от WsFederationAuthentication для отправки в API

Сражался с попыткой извлечь токен на предъявителя после аутентификации в ADFS...

У меня есть API, который будет принимать токен Bearer и проверять его на соответствие ADFS.

У меня есть приложение Web Forms (.net 4.5.1), которое я изменяю, чтобы использовать ADFS 3.0 для реализации аутентификации SSO. До сих пор он правильно аутентифицируется на сервере ADFS (представляет на страницу входа в ADFS и входит в систему).

Моя проблема в том, что теперь я хочу, чтобы приложение WebForms вызывало мой Web API с использованием токена-носителя, я надеюсь, что он присутствует где-то в возвращенном ответе от ADFS, но где он находится и как его получить?

Я попытался использовать SecurityTokenValidated и события SecurityTokenReceived WsFederationAuthenticationNotifications, как показано ниже:

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

            app.UseCookieAuthentication(new CookieAuthenticationOptions());

            app.UseWsFederationAuthentication(
                new WsFederationAuthenticationOptions
                {
                    AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType, // "WS-Fed Auth (Primary)",
                    Wtrealm = realm,
                    MetadataAddress = metadata,
                    Notifications = new WsFederationAuthenticationNotifications
                    {
                        AuthenticationFailed = context =>
                        {
                            context.HandleResponse();
                            context.Response.Redirect("Home/Error?message=" + context.Exception.Message);
                            return Task.FromResult(0);
                        },

                        SecurityTokenValidated = token =>
                            {
                                Token = token.AuthenticationTicket.ToString();
                                return Task.FromResult(0);
                            },

                        SecurityTokenReceived = token =>
                        {
                            Token = token.ToString();
                            return Task.FromResult(0);
                        }
                    }
                });
}

Но я нигде не могу найти токен в объектах, возвращаемых событиями... Чего мне не хватает?

Спасибо за помощь.

1 ответ

Решение

Токен, полученный вами при входе в сеть, не подходит для вызова веб-API по двум причинам: A) аудитория токена является приложением веб-формы, в то время как веб-API должен принимать токены только там, где аудитория соответствует веб-API - в противном случае вы окажетесь в центре атак и B) токен, который вы получите от ADFS, является токеном SAML, который может быть довольно большим, поэтому его нельзя включать в заголовок HTTP (канонический способ включения токен на предъявителя для вызова веб-API). Если вы решите игнорировать вышесказанное и в любом случае использовать этот токен - в разделе Приобретение токена доступа с помощью JWT, используемого для аутентификации AzureBearerAuthentication, вы можете найти код, необходимый для извлечения битов входящего токена. Работает как с openid connect, так и с oauth middleware.

Другие вопросы по тегам