如何将OpenID集成到MVC4 Web API中

Qui*_*orn 14 openid dotnetopenauth asp.net-mvc-4 asp.net-web-api

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

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

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

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

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

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

这就是整个故事.是的,无论他们碰巧使用哪种语言或库,客户端角色都很容易编写.

顺便说一句,我所指的DotNetOpenAuth样本不是通过NuGet分发的.您从SourceForge获取样本.