【问题标题】:using wif with web api将 wif 与 web api 一起使用
【发布时间】:2017-06-01 02:54:57
【问题描述】:

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

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

这是我需要的:

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

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

谁能帮帮我。

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

【问题讨论】:

    标签: c# .net rest asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    根据您的描述,听起来您使用的是委托身份模型。即用户登录到 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 Token 是一种流行的格式,这里有一个 NuGet 包,其中包含一个处理程序

    https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/

    如果你使用其他的token类型,你可以自己写handler(其实不难)或者尝试在网上找。

    在 .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 添加......
    • 您是否使用 javascript 从浏览器显式调用 STS?我希望使用 WS-Federation Passive Profile 进行初始 Web 应用程序登录,然后使用引导上下文从服务器进行后续服务调用。如果您不这样做,那么我的答案可能不适合您...
    • 我正在显式调用 STS...我的 Web 应用程序配置有 microsoft.identitymodel 部分,该部分重定向到 sts,然后将该令牌发送回实际调用服务的 Web 应用程序
    【解决方案2】:

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

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

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

    【讨论】:

    • 我已经浏览了您提供的链接 ....但我不能使用任何其他框架 ....因为我们有 sts ,休息服务和网络应用程序 ....我们只需要解决这些问题就可以完成......可能正在使用微软身份模型
    猜你喜欢
    • 2011-07-12
    • 2016-01-09
    • 2014-10-29
    • 2015-10-10
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多