5

我有很多文章和 SO 问题基于基于声明的 WCF Restful 服务身份验证,但我正在使用 MVC Web API 开发 RESTful 服务(不是 WCF 休息服务)......

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

这是我需要的:

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

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

谁能帮我解决这个问题。

注意:我没有使用 WCF Restservice,而是使用 MVC Web API

4

2 回答 2

11

根据您的描述,听起来您正在使用委托身份模型。也就是说,用户登录到 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 文件中。

于 2013-06-24T16:11:24.427 回答
1

如果您的客户端未通过身份验证,则您的 Web Api 服务应返回 401 Unauthorized 响应。

然后,您的客户将负责寻求身份验证并获得新令牌。您应该在 WWW-authenticate 标头中返回指向您的登录表单的链接

该视频可能会有所帮助 - 保护 ASP.NET Web API http://vimeo.com/43603474

于 2013-06-24T15:01:41.870 回答