如何从WsFederationAuthentication获取承载令牌以发送到API

时间:2015-11-13 23:04:05

标签: c# asp.net owin katana adfs3.0

在针对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);
                        }
                    }
                });
}

但我无法在事件返回的对象中的任何位置找到令牌...... 我错过了什么?

感谢您的帮助。

1 个答案:

答案 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中间件。