如何将OpenID集成到MVC4 Web API中

14

我正在使用MVC4编写一个Web API,应该由多个客户端类型消费。 我想使用OpenID进行身份验证。

我已经下载了DotNetOpenAuth NuGet包,但目前所有示例都是针对客户端应用程序而非API。

我的问题很简单。 我希望客户端发送身份验证请求到我的API。 API通过OpenID提供程序进行身份验证。 然后,API设置所需的任何内容,以便在整个Web API调用中使用[Authorize]标签。

我知道在.NET应用程序中,可以调用FormsAuthentication.SetCookie,但这对其他语言来说是否也是易于实现的解决方案?

概括地说,如何将OpenID集成到允许多种语言调用和消费的MVC4 Web API中,以便使用Authorize标签?


1
对于回来的人,DotNetOpenAuth 的 NuGet 包似乎并不完全更新(截至今天)。它没有包括 OAUTH2 命名空间。相反,请使用此 sourceforge 链接 - Quickhorn
请查看此项目 http://weblogs.asp.net/haithamkhedre/archive/2011/03/13/openid-authentication-with-asp-net-mvc3-dotnetopenauth-and-openid-selector.aspx - NoWar
1个回答

24
您可能会混淆身份验证和授权的角色。听起来您的Web API需要两者
让我们从授权开始。每个API(即,由非浏览器客户端应用程序访问的Web URL)都允许匿名访问或必须经过授权(即授权)。授权是OAuth的领域。OAuth(v2,假定)描述了客户端如何授权调用您的WebAPI。
假设在授权过程中,用户登录到您的服务。登录用户的这一步骤是身份验证。它与授权是正交的。无论您通过OpenID、用户名/密码、X.509证书等方式对用户进行身份验证,都不应影响您的WebAPI调用如何获得授权。换句话说,您的WebAPI方法不应关心用户如何进行身份验证(阅读:没有任何OpenID联系)。它们将应用授权过滤器来验证传入请求上的授权并将其转换为一些信息,包括授权访问的帐户的用户名、访问级别、授权客户端的ID等。
因此,整个情景可能按以下方式逐步进行:
  1. 一个使用第三方客户端应用程序(为简单起见,假设此客户端应用程序是第三方Web应用程序)的用户想要使用需要客户端以用户的名义访问您的WebAPI的功能。
  2. 客户端需要获取授权以有限模拟用户,因为客户端调用您的WebAPI。他们从OAuth 2重定向到您的服务的授权端点开始。如果这是使用DotNetOpenAuth实现的,则可以使用WebServerClient类。
  3. 您的授权端点扮演OAuth 2授权服务器的角色,并因此使用DotNetOpenAuth的AuthorizationServer类。它做的第一件事是检查请求中是否包含ASP.NET表单身份验证cookie。这个cookie自然地表明用户是否已经在他们的浏览器上登录到您的服务,并且如果是这样,那么该用户是谁。检查此cookie只需调用Controller.User。请注意,您的授权端点是MVC而不是WebAPI,因为其响应是针对浏览器/用户而不是客户端应用程序的。假设没有这样的cookie, Controller.User 为null(或User.Identity.IsAuthenticatedfalse)。有关如何实现此端点,请参阅OAuthAuthorizationServer示例。
  4. 您的授权端点响应重定向到用户登录页面,包括查询字符串中保留完整传入的OAuth 2授权请求URL的redirectUrl参数。
  5. 您的用户登录页面是充当OpenID Relying Party的MVC端点。此端点使用DotNetOpenAuth的OpenIdRelyingParty类。请注意,此端点不知道OAuth 2或授权内容。它只是验证用户身份。验证用户身份后,它将重定向回redirectUrl参数中的URL。有关如何执行此操作,请参阅OpenIdRelyingPartyMvc示例。
  6. 授权端点重复其先前的步骤,但这次有一个FormsAuthentication cookie,因此它继续显示一个页面,询问用户是否要授权客户端访问用户的数据。用户点击确定。(注意:在此用户授权页面上实现XSRF和clickjacking缓解措施)。
  7. 授权端点处理用户的肯定响应,并调用AuthorizationServer创建授权记录并将响应返回给客户端。此调用的结果之一是制定重定向响应以向客户端提供授权代码。
  8. 浏览器现在正在拉取传递授权代码的客户端应用程序的URL。然后,客户端使用WebServerClient类交换授权代码以获取访问令牌(通常还包括刷新令牌)。
  9. 客户端应用程序现在直接调用您的WebAPI URL,包括它通过OAuth 2获取的访问令牌在HTTP授权标头中。
  10. 您的WebAPI扮演OAuth2资源服务器的角色,您应用于验证传入的OAuth 2访问令牌的授权过滤器属性使用DotNetOpenAuth ResourceServer类来执行其工作。您可以参考OAuthResourceServer示例,甚至更好地参考David Christiansen的WebAPI示例以了解如何执行此操作。

这就是整个故事。而且,客户端角色的编写无论使用哪种语言或库都很容易。

顺便说一句,我提到的DotNetOpenAuth示例不通过NuGet分发。您可以从SourceForge 获取示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接