如何将OpenID集成到MVC4 Web API中

时间:2012-09-03 14:31:27

标签: openid asp.net-mvc-4 asp.net-web-api dotnetopenauth

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

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

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

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

问题简而言之。如何将OpenID集成到MVC4 web api中,以允许使用可由多种语言调用和使用的Authorize标记?

1 个答案:

答案 0 :(得分:23)

您可能会混淆身份验证和授权的角色。听起来您的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为空(或User.Identity.IsAuthenticatedfalse)。有关如何实现此端点的信息,请参阅OAuthAuthorizationServer示例。
  4. 您的授权终端通过重定向到用户登录页面进行响应,包括查询字符串中的redirectUrl参数,该参数保留完整的传入OAuth 2授权请求URL。
  5. 您的用户登录页面是一个MVC端点,充当OpenID依赖方。此端点使用DotNetOpenAuth的OpenIdRelyingParty类。请注意,此端点不知道OAuth 2或授权内容。它只是验证用户。在对用户进行身份验证后,它会重定向回redirectUrl参数中的URL。有关如何执行此操作,请参阅OpenIdRelyingPartyMvc示例。
  6. 授权端点重复其先前步骤,除非此时存在FormsAuthentication cookie,因此它继续向用户显示一个页面,询问他们是否要授权客户端访问用户的数据。用户单击是。 (注意:在此用户授权页面上实施XSRF和clickjacking缓解)。
  7. 授权端点处理用户的肯定响应,并调用AuthorizationServer创建授权记录并将响应返回给客户端。此调用的结果之一是为客户端提供重定向响应,为其提供授权代码。
  8. 浏览器现在正在拉取客户端应用程序的URL,并将授权代码传递给它。然后,客户端使用WebServerClient类来交换访问令牌的授权代码(通常也是刷新令牌)。
  9. 客户端应用现在直接调用您的WebAPI网址,包括通过HTTP授权标头中的OAuth 2获取的访问令牌。
  10. 您的WebAPI充当OAuth2资源服务器的角色,您应用于WebAPI方法的授权过滤器属性验证传入的OAuth 2访问令牌使用DotNetOpenAuth ResourceServer类来完成其工作。您可以参考OAuthResourceServer示例,或者甚至更好地参考David Christiansen's WebAPI sample来了解如何执行此操作。
  11. 这就是整个故事。是的,无论他们碰巧使用什么语言或库,客户端角色都很容易编写。

    BTW,我所指的DotNetOpenAuth样本不是通过NuGet分发的。你get the samples from SourceForge