我正在编写一个使用MVC4的Web API,应该由多个客户端类型使用。我想使用OpenID进行身份验证。
我已经下载了DotNetOpenAuth NuGet包,但到目前为止所有示例都是针对客户端应用而不是API。
我的问题很简单。我想让客户端向我的API发送身份验证请求。 API使用OpenID提供程序进行身份验证。然后,API会设置所需的任何内容,以便在整个Web api调用中使用[Authorize]标记。
据我所知,在.NET应用程序中,可以调用FormsAuthentication.SetCookie,但这对其他语言来说也是一种易于实现的解决方案吗?
问题简而言之。如何将OpenID集成到MVC4 web api中,以允许使用可由多种语言调用和使用的Authorize标记?
答案 0 :(得分:23)
您可能会混淆身份验证和授权的角色。听起来您的Web API需要两者。
让我们从授权开始吧。每个API(即由浏览器以外的客户端应用程序访问的Web URL)允许匿名访问或必须被授权(即授权)。授权是 OAuth 的域名。 OAuth(大概是v2)描述了客户端如何授权对WebAPI的调用。
大概是作为授权过程的一部分,用户登录您的服务。登录用户的步骤是身份验证。它与授权正交。无论您是通过OpenID,用户名/密码,X.509证书等对用户进行身份验证,都应与您的WebAPI呼叫授权方式无关。换句话说,您的WebAPI方法不应该关心用户如何进行身份验证(读取:没有OpenID可以绑定任何内容)。他们将拥有一个授权过滤器,用于验证传入请求的授权并将其转换为几条信息,包括授权访问的帐户的用户名,访问级别,授权的ID客户等
一步一步,整个场景可能会是这样的:
Controller.User
为空(或User.Identity.IsAuthenticated
为false
)。有关如何实现此端点的信息,请参阅OAuthAuthorizationServer示例。redirectUrl
参数,该参数保留完整的传入OAuth 2授权请求URL。redirectUrl
参数中的URL。有关如何执行此操作,请参阅OpenIdRelyingPartyMvc示例。AuthorizationServer
创建授权记录并将响应返回给客户端。此调用的结果之一是为客户端提供重定向响应,为其提供授权代码。WebServerClient
类来交换访问令牌的授权代码(通常也是刷新令牌)。 这就是整个故事。是的,无论他们碰巧使用什么语言或库,客户端角色都很容易编写。
BTW,我所指的DotNetOpenAuth样本不是通过NuGet分发的。你get the samples from SourceForge。