在针对ADFS进行身份验证后尝试提取承载令牌一直在努力......
我有一个接受Bearer令牌并根据ADFS验证它的API。
我有一个Web表单(.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);
}
}
});
}
但我无法在事件返回的对象中的任何位置找到令牌...... 我错过了什么?
感谢您的帮助。
答案 0 :(得分:1)
您在网络登录时收到的令牌不适合调用网络API,原因有两个:A)令牌的受众是网络表单应用,而网络API只应接受受众的令牌对应于Web API - 否则将打开你在中间攻击中的人和B)从ADFS获得的令牌是一个SAML令牌,它可能非常大,因此不适合包含在HTTP头中(规范方式)包括用于调用web API的承载令牌。 如果您决定忽略上述内容并使用该令牌 - 在Acquiring an Access token by using JWT used for AzureBearerAuthentication中,您可以找到提取传入令牌位所需的代码。它适用于openid connect和oauth中间件。