2013-06-24 31 views
5

我有很多的文章和SO问题,基于对WCF RESTful服务基础要求身份验证,但我使用MVC的Web API来开发RESTful服务(不WCF REST服务)...使用WIF与网页API

那么您能否帮我理解如何使用基于声明的身份验证来保护RESTful服务?

以下是我需要:

  1. 我有一个Web应用程序和MVC4 Web的API服务
  2. 我们有STS
  3. 的MVC Web App的信任STS
  4. 现在用户登录进入Web应用程序,他被重定向到STS登录页面。
  5. 登录后,他被重定向回MVC网站。
  6. 此Web应用程序调用Web-API服务。

现在,我一直卡在第4点。我们有一个RESTful服务,但需要实现WIF。

任何人都可以帮助我这个。

注:我不使用WCF Restservice但使用MVC的Web API

回答

11

从你的描述,这听起来像您使用的是委派的身份模型。也就是说,用户登录到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。

+0

如何附加它并调用WEB API .....你能提供一个例子....或示例代码? –

+1

你能否也请提供一个使用JavaScript调用相同的例子(在这种情况下我们如何附加令牌),也从你的回答中不清楚在服务方面应该是什么配置/代码.....? –

+0

也在服务端如何看到像emailid,userid等声明集的元素......这通常是由STS添加时生成声明..... –

1

如果您的客户端未通过身份验证的您的Web API服务应该返回一个401未授权的响应。

然后,你的客户负责任地寻求认证并获得新的令牌。你应该链接返回到您的日志的形式在WWW-Authenticate头

这段视频可能会帮助 - 保护的ASP.NET Web API的http://vimeo.com/43603474

+0

我已经通过你提供的链接....但我不能使用任何其他框架....因为我们有sts,休息服务和web应用程序就位....我们只需要玩这些要完成....可能使用微软身份模型 –