【问题标题】:How to get bearer token from WsFederationAuthentication to send to API如何从 WsFederationAuthentication 获取不记名令牌以发送到 API
【发布时间】:2015-11-13 23:04:05
【问题描述】:

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

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

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

我的问题是我现在希望 WebForms 应用使用我希望在 ADFS 返回的响应中某处存在的不记名令牌调用我的 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);
                        }
                    }
                });
}

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

感谢大家的帮助。

【问题讨论】:

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


    【解决方案1】:

    作为 Web 登录的一部分,您收到的令牌不适合调用 Web API,原因有两个:A) 令牌的受众是 webform 应用程序,而 Web API 应该只接受受众的令牌对应于 Web API - 否则会在中间攻击中打开您的大门,并且 B)您从 ADFS 获得的令牌是 SAML 令牌,它可能非常大,因此不适合包含在 HTTP 标头中(规范方式包括用于调用 Web API 的不记名令牌)。 如果您决定忽略上述内容并使用该令牌 - 在Acquiring an Access token by using JWT used for AzureBearerAuthentication 中,您可以找到提取传入令牌位所需的代码。它适用于 openid connect 和 oauth 中间件。

    【讨论】:

    • 感谢您的帮助,但我在这里感到困惑。我首先使用 Windows 客户端进行了测试,该客户端针对 ADFS 进行了身份验证,并将其承载令牌发送到我的 API,然后使用 OWIN 重新验证它,根据那里的示例,这似乎是可行的方法......该方法需要如何更改当 WebForms 应用程序替换 Windows 客户端时,事情是否正常? (我希望我的 API 不必关心调用它的内容)
    • API 并不关心。不同之处在于,在 Windows 客户端中,您获得了专门用于 API 的令牌,而使用 Web 应用程序(无论是表单还是 mvc),您都试图将您获得的用于登录 Web 应用程序的令牌重新用于 API .代币不可替代,它们就像银行支票——为我写的一张支票不能被你兑现,反之亦然
    • 维托里奥,我是你作品的粉丝。非常高兴你花时间回答我的问题。现在,我在研究期间查看了您的许多文章以及许多其他文章,但找不到本地 ADFS/webforms/WCF API(本身不是 Web API)的示例……如果我不应该发送从我的 Web 应用程序到我的 API 的令牌,API 应该如何对其调用者进行身份验证?
    • 太客气了。我的荣幸! Adfs 2 和 3 没有为 Web 应用程序提供现代身份验证流程来访问 Web API。 Windows Server 2016 中的 Adfs(目前处于预览阶段)提供 azure ad 为此目的提供的所有流:代码授权、openid 连接混合、onbehalfof。
    • 所以我想以目前的技术状态 (ADFS 3),我别无选择,只能继续我的计划,在我的 webforms 应用程序中构建/检索不记名令牌并将其发送到 API?
    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 2021-03-30
    • 1970-01-01
    • 2021-08-05
    • 2017-03-10
    • 2021-12-17
    • 2020-06-20
    • 2016-12-14
    相关资源
    最近更新 更多