如何从 WsFederation 身份验证获取承载令牌以发送到 API

How to get bearer token from WsFederationAuthentication to send to API

在针对 ADFS 进行身份验证后,一直在尝试提取不记名令牌...

我有一个 API 可以接受 Bearer 令牌并针对 ADFS 对其进行验证。

我有一个 Web 窗体 (.net 4.5.1) 应用程序,我正在修改它以使用 ADFS 3.0 来实现 SSO 身份验证。到目前为止,它针对 ADFS 服务器进行了正确的身份验证(出现在 ADFS 登录页面并登录)。

我的问题是我现在希望 WebForms 应用程序使用不记名令牌调用我的 Web API ?

我尝试使用 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);
                        }
                    }
                });
}

但是我在事件返回的对象中的任何地方都找不到令牌... 我错过了什么?

感谢大家的帮助。

作为网络登录的一部分,您收到的令牌不适合调用网络 API,原因有二:A) 令牌的受众是网络表单应用程序,而网络 API 应该只接受观众对应于网络的令牌 API - 否则会让你面临中间人攻击和 B) 你从 ADFS 获得的令牌是一个 SAML 令牌,这可能很漂亮大,因此不适合包含在 HTTP header 中(包含调用 Web 的承载令牌的规范方式 API)。 如果您决定忽略上述内容并仍然使用该令牌 - 在 Acquiring an Access token by using JWT used for AzureBearerAuthentication 中,您可以找到提取传入令牌的位所需的代码。它适用于 openid connect 和 oauth 中间件。