Как получить токен на предъявителя от 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.