C# 如何从WsFederationAuthentication获取要发送到API的承载令牌
在对ADFS进行身份验证后试图提取承载令牌 我有一个API,它将接受承载令牌并根据ADF对其进行验证 我有一个Web表单(.net 4.5.1)应用程序,我正在修改它以使用ADFS 3.0实现SSO身份验证。到目前为止,它针对ADFS服务器进行了正确的身份验证(显示到ADFS登录页面并登录) 我的问题是,我现在希望WebForms应用程序使用承载令牌调用我的Web API,我希望它出现在ADFS返回的响应中的某个地方,但它在哪里,我如何检索它 我尝试使用SecurityTokenValidated和SecurityTokenReceived WsFederationAuthenticationNotifications事件,如下所示: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
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?