如何将OpenID集成到MVC4 Web API中

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

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

我的问题很简单我想让客户端向我的API发送身份验证请求. API使用OpenID提供程序进行身份验证.然后,API将设置所有需要的内容,以便在Web api调用期间使用[Authorize]标签.

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

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

解决方法

您可能会混淆身份验证和授权的角色.听起来你的Web API需要两个.

我们从授权开始吧.每个API(即除了浏览器之外的客户端应用程序访问的网址)都允许匿名访问或者必须被授权(即授权).授权是OAuth的域名. OAuth(v2,大概)描述了客户端如何授权对您的WebAPI的调用.

大概作为授权过程的一部分,用户登录您的服务.登录用户的这个步骤是认证.它与授权正交.无论您通过OpenID,用户名/密码,X.509证书等对用户进行身份验证,都应与您的WebAPI呼叫的授权无关.换句话说,您的WebAPI方法不应该关心用户如何进行身份验证(请参阅:无OpenID关联).他们将拥有一个应用于它们的授权过滤器,用于验证传入请求的授权,并将其转换为几个信息,包括授权访问的帐户的用户名,访问级别,授权的ID客户等

所以一步一步,整个场景可能会像这样:

>操作第三方客户端应用程序的用户(为了简单起见,我们假定此客户端应用程序是第三方Web应用程序)希望使用需要客户端以用户名称访问WebAPI的功能.
>客户端需要获得授权,因为客户端对您的WebAPI进行调用才能有限地模拟用户.他们从您的服务的OAuth 2重定向到授权端点开始.如果这是使用DotNetOpenAuth实现的,那么可以使用WebServerClient类.
>您的授权终端填写OAuth 2授权服务器的角色,因此使用DotNetOpenAuth的AuthorizationServer类.它首先做的是检查请求中是否包含ASP.NET表单验证cookie.这个cookie对于用户是否已经在其浏览器上登录了您的服务是自然的,如果是,那个用户是谁.检查此cookie是一个简单的调用Controller.User.请注意,您的授权端点是MVC而不是WebAPI,因为它的响应是对浏览器/用户而不是客户端应用程序.我们假设没有这样的cookie,Controller.User为null(或User.Identity.IsAuthenticated为false).有关如何实现此端点,请参阅OAuthAuthorizationServer示例.
>您的授权终端会以重定向用户登录页面进行响应,包括查询字符串中保留完整传入的OAuth 2授权请求URL的redirectUrl参数.
>您的用户登录页面是充当OpenID依赖方的MVC端点.此端点使用DotNetOpenAuth的OpenIdRelyingParty类.请注意,此端点不知道OAuth 2或授权内容.它只是认证用户.验证用户后,将重定向到redirectUrl参数中的URL.有关如何执行此操作,请参阅OpenIdRelyingPartyMvc示例.
>授权端点重复其先前的步骤,除了此时有一个FormsAuthentication cookie,所以它继续向用户显示一个页面,询问他们是否要授权客户端访问用户的数据.用户点击是. (请注意:在此用户授权页面上实现XSRF和Clickjacking缓解).
>授权端点处理用户的肯定响应,并调用AuthorizationServer创建授权记录并将响应返回给客户端.此调用的其中一个结果是为客户端制定了向其授予授权码的重定向响应.
>浏览器正在拉出客户端应用程序的URL,传递授权码.客户端然后使用WebServerClient类交换访问令牌的授权码(通常也是刷新令牌).
>客户端应用程序现在直接调用您的WebAPI URL,包括通过HTTP Authorization标头中的OAuth 2获取的访问令牌.
>您的WebAPI填写OAuth2资源服务器的角色,以及您应用于WebAPI方法的授权过滤器属性来验证传入的OAuth 2访问令牌使用DotNetOpenAuth ResourceServer类来完成其工作.您可以参考OAuthResourceServer示例,甚至更好的David Christiansen’s WebAPI sample来做这个.

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

BTW,我引用的DotNetOpenAuth样本不是通过NuGet分发的.你get the samples from SourceForge.

相关文章

操作步骤 1、进入elasticsearch的plugin,进入ik。进入config。 2、在config下面建立以.dic为后缀的字典...
lengend data数据中若存在'',则表示换行,用''切割。
代码实现 option = { backgroundColor: '#080b30', tooltip: { trigger: &...
问题原因 原因在于直接在js中取的变量并复制给var变量。 于是就变成这样。 解决办法 var data = &#...
前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选...
对于很多人来说,用字符编码都是熟能生巧,而不清楚为什么是那样的字符编码,所以我在这列了一个表,翻...