根据您的描述,听起来您正在使用委托身份模型。也就是说,用户登录到 Web 应用程序,当 Web 应用程序调用 Web API 服务时,它使用当前登录用户的身份。
如果是这种情况,那么您需要配置 WIF 以保存“引导令牌”。这样做的效果是原始安全令牌可作为当前 ClaimsIdentity 的属性使用。然后,您可以使用它将请求的 Authorize 标头设置为 Web API 服务调用。
要在 .Net 4.5 中启用此功能,请将 WIF 元素上的 saveBootstrapContext 属性设置为 true:
<system.identityModel>
<identityConfiguration saveBootstrapContext="true">
...
对于 .Net 4,配置看起来像这样:
<microsoft.identityModel>
<service saveBootstrapTokens="true">
...
然后要从 Web 应用程序访问它,您可以在将调用 Web API 的控制器中执行类似(取决于您拥有多少身份)的操作。对于.Net 4.5:
SecurityToken token = (User as ClaimsPrincipal).Identities[0].BootstrapContext;
对于.Net 4:
SecurityToken token = (User as ClaimsPrincipal).Identities[0].BootstrapToken;
获得原始安全令牌后,您现在可以将其作为 Authorize 标头附加到对 Web API 的调用。通常,这将作为 Bearer 标记附加,这只是一种奇特的说法,即您将单词“bearer”附加到标头值的开头。要附加令牌,请执行以下操作:
WebClient request = new WebClient();
request.Headers.Add("Authorization","bearer " + tokenAsString);
注意:通常您会在传输过程中对令牌值进行加密或 base64 编码,而不是附加原始字符串,特别是如果它是 XML,因为某些框架会在传输过程中破坏 XML。
要将标记转换为字符串,您应该使用派生自的类 SecurityTokenHandler
。标准框架程序集中包含许多用于处理某些标准标记类型的类。对于 REST 服务,JSON Web 令牌是一种流行的格式,这里有一个 NuGet 包,其中包含一个处理程序
https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/
如果您使用其他令牌类型,您可以编写自己的处理程序(实际上并不难)或尝试在网络上查找。
在 .Net 4.5 中,SecurityTokenHandler
该类有一个WriteToken(SecurityToken)
将令牌作为字符串返回的方法。在 WIF 的早期版本中,仅支持 XML 版本的 WriteToken。
有几个示例展示了如何在服务器端将 SecurityTokenHandler 用于 REST 服务。一个很好的例子是here
http://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc/view/Discussions#content
所有相关代码都包含在 global.asax.cs 文件中。