C# 如何从WsFederationAuthentication获取要发送到API的承载令牌

C# 如何从WsFederationAuthentication获取要发送到API的承载令牌,c#,asp.net,owin,katana,adfs3.0,C#,Asp.net,Owin,Katana,Adfs3.0,在对ADFS进行身份验证后试图提取承载令牌 我有一个API,它将接受承载令牌并根据ADF对其进行验证 我有一个Web表单(.net 4.5.1)应用程序,我正在修改它以使用ADFS 3.0实现SSO身份验证。到目前为止,它针对ADFS服务器进行了正确的身份验证(显示到ADFS登录页面并登录) 我的问题是,我现在希望WebForms应用程序使用承载令牌调用我的Web API,我希望它出现在ADFS返回的响应中的某个地方,但它在哪里,我如何检索它 我尝试使用SecurityTokenValidate

在对ADFS进行身份验证后试图提取承载令牌

我有一个API,它将接受承载令牌并根据ADF对其进行验证

我有一个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);
                        }
                    }
                });
}
但是我在事件返回的对象中找不到令牌。。。 我错过了什么


感谢所有帮助。

作为web登录的一部分,您收到的令牌不适合调用web API,原因有两个:a)令牌的受众是webform应用程序,虽然Web API应该只接受观众对应于Web API的令牌——否则会使您处于中间人攻击中,而B)您得到ADFS的令牌是一个SAML令牌,这是相当大的,因此不适合包含在HTTP报头中(包括承载令牌以调用Web API的规范方式)。.
如果您决定忽略上述内容并使用该令牌,那么您可以在中找到提取传入令牌位所需的代码。它同时适用于openid connect和oauth中间件。

感谢您的帮助,但我在这里感到困惑。我首先使用一个Windows客户端进行测试,该客户端根据ADFS进行身份验证,并将其承载令牌发送到我的API,然后使用OWIN对其进行重新验证,根据那里的示例,这似乎是一种方法。。。当WebForms应用程序替换Windows客户端时,该方法需要如何更改才能正常工作?(我希望我的API不必关心调用它的内容)API实际上并不关心。不同之处在于,在Windows客户端中,您获得了一个专门用于API的令牌,而在web应用中(无论是表单还是mvc),您都试图为API重新利用您获得的用于在web应用中签名的令牌。代币是不可替代的,它们就像银行支票——一张为我写的支票不能由你和副凡尔赛维托里奥兑现,我是你作品的粉丝。非常高兴你花时间回答我的问题。现在,在我的研究期间,我已经阅读了您的许多文章和其他许多文章,但没有找到一个关于内部ADF/webforms/WCF API(不是Web API本身)的示例。。。如果我不应该将令牌从我的web应用程序发送到我的API,API应该如何对其调用方进行身份验证?太客气了。我的荣幸!ADF2和ADF3没有为web应用程序提供访问web API的现代身份验证流。windows server 2016中的Adfs(目前处于预览阶段)提供azure ad为此目的提供的所有流:代码授予、openid连接混合、onbehalfof。因此,我想根据当前的技术状态(Adfs 3),我别无选择,只能继续在我的webforms应用程序中构建/检索承载令牌并将其发送到API?