gpt4 book ai didi

openid - 如何将 OpenID 集成到 MVC4 Web API 中

转载 作者:行者123 更新时间:2023-12-03 21:24:16 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

让我们从授权开始。每个 API(即由浏览器以外的客户端应用程序访问的 Web URL)要么允许匿名访问,要么必须经过授权(即授权)。授权是 OAuth 的域。 OAuth(大概是 v2)描述了客户端如何授权对您的 WebAPI 的调用。

据推测,作为授权过程的一部分,用户登录到您的服务。这一步登录用户就是认证。它与授权正交。您是否通过 OpenID、用户名/密码、X.509 证书等对用户进行身份验证,应该与您的 WebAPI 调用的授权方式无关。换句话说,您的 WebAPI 方法不应该关心用户如何进行身份验证(阅读:没有任何 OpenID 绑定(bind))。他们将拥有一个授权过滤器,用于验证传入请求的授权并将其转换为几条信息,包括授权访问的帐户的用户名、访问级别、被授权人的 id客户等

所以一步一步,整个场景可能是这样的:

  • 操作 3rd 方客户端应用程序的用户(为了简单起见,我们假设该客户端应用程序是 3rd 方 Web 应用程序)想要使用要求客户端以用户的名义访问您的 WebAPI 的功能。
  • 当客户端调用您的 WebAPI 时,客户端需要获得有限模拟用户的授权。它们以 OAuth 2 重定向到您服务的授权端点开始。如果这是使用 DotNetOpenAuth 实现的,则可以使用 WebServerClient类(class)。
  • 您的授权端点充当 OAuth 2 授权服务器的角色,因此,使用 DotNetOpenAuth 的 AuthorizationServer类(class)。它所做的第一件事是检查请求中是否包含 ASP.NET 表单例份验证 cookie。此 cookie 是关于用户是否已在其浏览器上登录您的服务的自然指示,如果已登录,则该用户是谁。检查这个 cookie 是一个简单的调用 Controller.User .请注意,您的授权端点是 MVC 而不是 WebAPI,因为它的响应是针对浏览器/用户,而不是客户端应用程序。让我们假设没有这样的 cookie 和 Controller.User为空(或 User.Identity.IsAuthenticatedfalse )。有关如何实现此端点,请参阅 OAuthAuthorizationServer 示例。
  • 您的授权端点响应重定向到用户登录页面,包括 redirectUrl保留完整传入 OAuth 2 授权请求 URL 的查询字符串中的参数。
  • 您的用户登录页面是充当 OpenID 依赖方的 MVC 端点。此端点使用 DotNetOpenAuth 的 OpenIdRelyingParty类(class)。请注意,此端点对 OAuth 2 或授权内容一无所知。它只是对用户进行身份验证。对用户进行身份验证后,它重定向回 redirectUrl 中的 URL。争论。有关如何执行此操作,请参阅 OpenIdRelyingPartyMvc 示例。
  • 授权端点重复之前的步骤,除了这次有一个 FormsAuthentication cookie,所以它继续向用户显示一个页面,询问他们是否要授权客户端访问用户的数据。用户单击是。 (注意:在此用户授权页面上实现 XSRF 和点击劫持缓解措施)。
  • 授权端点处理用户的肯定响应并调用AuthorizationServer创建授权记录并将响应返回给客户端。此调用的结果之一是制定对客户端的重定向响应,并为其提供授权代码。
  • 浏览器现在正在拉取客户端应用程序的 URL,该 URL 将授权代码传递给它。然后客户端使用 WebServerClient类来交换访问 token 的授权代码(通常也是刷新 token )。
  • 客户端应用程序现在直接调用您的 WebAPI URL,包括它通过 HTTP 授权 header 中的 OAuth 2 获得的访问 token 。
  • 您的 WebAPI 充当 OAuth2 资源服务器的角色,您应用于 WebAPI 方法以验证传入 OAuth 2 访问 token 的授权过滤器属性使用 DotNetOpenAuth ResourceServer类来完成它的工作。您可以引用 OAuthResourceServer 示例,或者更好,David Christiansen's WebAPI sample如何做到这一点。

  • 这就是整个故事。是的,客户端角色很容易编写,无论他们碰巧使用什么语言或库。

    顺便说一句,我提到的 DotNetOpenAuth 示例不是通过 NuGet 分发的。您 get the samples from SourceForge .

    关于openid - 如何将 OpenID 集成到 MVC4 Web API 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249818/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com