2015-11-13 79 views
1

,试图对身份验证后ADFS提取承载令牌被打......如何从WsFederationAuthentication获得承载令牌发送到API

我将接受一个承载令牌并验证它针对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

您作为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中间件。

+0

感谢您的帮助,但我很困惑。我首先测试了一个Windows客户端,它对ADFS进行了身份验证,然后将它的不记名令牌发送给我的API,然后使用OWIN对它进行重新验证,这似乎是根据示例进行验证的方法......该方法需要更改当WebForms应用程序替换Windows客户端时正确的事情? (我希望我的API不必关心叫什么) – zukanta

+0

API确实不在乎。不同之处在于,在Windows客户端中,您获得了一个专门用于API的令牌,使用Web应用程序(无论是表单还是mvc)都尝试为API重新使用您获得的用于登录Web应用程序的令牌。代币是不可替代的,它们就像银行支票 - 为我写的一张支票不能兑现,反之亦然 – vibronet

+0

维托里奥,我是你工作的忠实粉丝。非常高兴你花时间来回答我的问题。现在,我在我的研究和许多其他许多文章中查看了许多文章,但无法找到内部部署ADFS/webforms/WCF API(本身不是Web API)的示例...如果我不应该发送从我的Web应用程序到我的API的令牌,API应如何验证其调用者? – zukanta