从你的描述,这听起来像您使用的是委派的身份模型。也就是说,用户登录到Web应用程序,当Web应用程序调用Web API服务时,它使用当前登录用户的身份。
如果是这种情况,那么您需要配置WIF来保存“引导令牌”。这样做的效果是,原始安全令牌作为当前ClaimsIdentity的属性可用。然后您可以使用它来设置他向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的调用。一般来说,这将作为不记名令牌附加,这只是一种奇怪的说法,即在报头值的起始处添加单词“承载者”。要安装令牌,做这样的事情:
WebClient request = new WebClient();
request.Headers.Add("Authorization","bearer " + tokenAsString);
注:一般来说,你将加密或Base64编码在运输途中的令牌值,而不是附加的原始字符串,尤其是如果它是XML,因为一些框架将破坏传输中的XML。
要将标记转换为字符串,您应该使用从SecurityTokenHandler
派生的类标准框架程序集中包含许多用于处理某些标准标记类型的类。对于REST服务的JSON网络令牌是一种流行的格式,并有包含处理程序,在这里
https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/
如果你使用一些其它记号类型NuGet包,您可以编写自己的处理程序(它事实上并不困难)或试图在网上找到。
在.Net 4.5中,SecurityTokenHandler
类有一个WriteToken(SecurityToken)
方法,该方法将令牌作为字符串返回。在早期版本的WIF中,只支持XML版本的WriteToken。
有几个示例显示如何在服务器端使用SecurityTokenHandler进行REST服务。一个很好的例子是在这里
http://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc/view/Discussions#content
所有相关的代码包含在该文件的global.asax.cs。
如何附加它并调用WEB API .....你能提供一个例子....或示例代码? –
你能否也请提供一个使用JavaScript调用相同的例子(在这种情况下我们如何附加令牌),也从你的回答中不清楚在服务方面应该是什么配置/代码.....? –
也在服务端如何看到像emailid,userid等声明集的元素......这通常是由STS添加时生成声明..... –