65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 中的 OAuth 简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (33投票s)

2013年4月14日

CPOL

9分钟阅读

viewsIcon

182716

OAuth 授权是一种使用第三方应用程序的开放标准授权。

引言

OAuth,即开放授权(Open standard for Auhtorization),已成为当今大多数应用程序的标准。在这里,我们将讨论什么是 OAuth 以及如何在 ASP.NET MVC 中实现它。

背景

什么是 OAuth?

在讨论其他内容之前,让我们先了解一下什么是 OAuth。假设用户在服务器上存储了一些资源,而一个第三方应用程序想要访问这些用户资源。这是一个我们生活中可能多次遇到的场景。假设我们在 Flickr 上有一些很酷的照片,想与我们的 Facebook 好友分享。我们去 Facebook,它会重定向到 Flickr,我们在那里提供我们的身份验证详细信息,就完成了。所有这一切最棒的地方在于,我们永远不需要与 Facebook 分享我们的 Flickr 详细信息。这就是 OAuth 授权的一个例子。

在上面的步骤 1 中,客户端通过提供用户 ID 和密码登录到其 Facebook 帐户。如果用户想与他的 Facebook 帐户分享他的 Flickr 图片,他会在 Facebook 中选择相应的选项。Facebook 会将他重定向到 Flickr,在那里他提供他的凭据(如上一步 2)。一旦用户登录到他的 Flickr 帐户,他就可以选择与他的 Facebook 帐户分享他的 Flickr 图片。

因此,与典型的 Web 应用程序中的普通身份验证过程不同,这里涉及两步身份验证。所以我们可以正式定义 OAuth 为:OAuth 是一个协议,允许最终用户授予第三方应用程序访问其存储在服务器上的资源的权限。

我们可以从 Facebook 检索用户帐户信息,以便在我们的应用程序中使用。我们可以出于各种目的使用这些信息,例如根据每个用户的个人偏好创建定制的体验。OAuth 2.0 是 OAuth 的最新版本,它与 OAuth 1.0 不向后兼容。不同的提供商使用不同版本的 OAuth。例如,Facebook 和 Twitter 使用 OAuth 2.0 版本。

使用 OAuth 的优势

将第三方应用程序的访问权限授予用户在网站上的资源,对最终用户来说是有优势的,因为他们可以轻松地将现有资源与其他应用程序共享,而无需在新的网站上复制资源。

如今,大多数互联网用户都拥有 Google、Microsoft、Facebook 等不同网站的多个帐户。想象一下,当可怜的用户被要求在另一个网站上重新注册的情况。我敢肯定你可能体会过这种感受,因为注册新网站很耗时。

使用 OAuth,应用程序可以允许用户使用其现有凭据(在另一个网站上)登录。因此,用户无需在新网站上创建和记住其他凭据。作为开发人员,它对您有一个好处,因为您可以将授权委托给另一个受信任的网站。这些代表其他应用程序授权用户的受信任网站称为**身份提供商**。

使用开放式身份验证,用户可以授予第三方应用程序对其存储在其他网站上的资源的有限访问权限。用户永远不需要与这些第三方共享他的凭据
应用程序。应用程序使用**访问令牌**而不是用户 ID 和密码来获取用户数据。

OAuth 如何工作 

在正常情况下,用户在服务器上存储了一些他可以使用用户 ID 和密码访问的资源。用户提供用户 ID 和密码凭据,然后获得对其资源的访问权限。这是强制性的,以确保用户资源(可能是图片或其他文档)的安全。

此处,此事务中涉及的主要实体是:

  • 客户端
  • 服务器 
  • 用户访问存储在服务器上的其资源
  • 用户存储在服务器上并试图访问的资源。

这可以通过以下流程图进行说明。

在上图的流程图中,用户通过身份验证被允许访问其资源,而身份验证是依赖于身份识别的过程。但关键在于,以上所有过程主要由单个应用程序执行。

由于用户 ID 和密码验证发生在用户正在访问的同一应用程序中,因此用户的密码很可能以加密格式存储在应用程序的数据库中。由于密码是加密的,用户可以确信他的凭据只有他自己知道(忽略他的帐户被黑客攻击的情况 J),因此他的凭据被滥用的可能性非常小。

上述场景代表了应用程序执行的典型用户身份验证过程。在使用 OAuth 身份验证的应用程序中,过程会略有不同。用户不是直接登录到应用程序,而是被重定向到另一个网站,在那里他需要输入他的凭据。

无论我们使用哪个提供商,以下步骤都是通用的。

  • 向提供商注册我们的应用程序并接收密钥和机密
  • 一旦用户表明他想通过提供商进行身份验证,我们的应用程序就会向提供商请求一个**请求令牌**(这只是一组额外的凭据)。
  • 在最后一步,我们的应用程序会向提供商请求**访问令牌**。一旦我们的应用程序收到**访问令牌**,它就可以访问用户的数据。

下图说明了我们上面讨论的内容。

在最后一步,身份验证提供商会将访问令牌发送回应用程序。我们的应用程序使用访问令牌来访问用户数据。

使用代码

现在,让我们构建一个简单的 MVC 应用程序,允许用户使用他的 Facebook 凭据登录。我们将实现一个使用 Facebook 作为身份提供商的应用程序,但由于所有提供商的基本步骤都相同,我们也可以使用 Twitter 等其他提供商,只需对我们的应用程序进行少量更改。

一旦我们用 OAuth 实现了一个简单的应用程序,上述步骤就会变得清晰。

Visual Studio 2012 开箱即用地为各种 ASP.NET 应用程序(如 Web Forms 和 MVC)提供了 OAuth 支持。

以下是创建使用 OAuth 通过其 Facebook 帐户进行用户身份验证的 MVC 应用程序的步骤。

在“新建项目”对话框中,在模板列表中选择“ASP.NET MVC 4 应用程序”。

选择“Internet 应用程序”作为项目模板。

单击“创建”按钮后,将创建一个新项目,您可以在“App_Start”文件夹中找到一个名为 **AuthConfig.cs** 的文件,其中包含一些注释掉的代码。

如果我们现在运行该应用程序,我们将看到在“使用其他服务登录”下方没有显示任何提供商。这是因为我们还没有启用外部提供商。接下来我们将看到如何进行。

在 Facebook 注册网站

由于我们将使用 Facebook 作为身份提供商,因此在进行任何其他操作之前,我们需要在 Facebook 上注册我们的应用程序。当我们注册我们的网站时,我们会收到 ID 和密钥。要注册我们的应用程序,请访问 URL https://developers.facebook.com/apps 并登录。

登录后,单击右上角的“创建新应用”。

在“创建新应用”对话框中,输入您要创建的应用程序的名称。在此,我们输入 OAuthApp,然后单击“继续”。

在下一个窗口中,输入应用程序 URL。如果您使用的是开发 URL,可以将其设置为 https:///。您还将看到 AppId 和 App Secret(下方未显示)。请记下 AppId 和 App Secret,我们将在应用程序中使用它们。

单击“保存更改”。

返回 Visual Studio,打开 App_Start 文件夹中的 **AuthConfig.cs**。找到 **AuthConfig.cs** 中的以下行。

OAuthWebSecurity.RegisterFacebookClient( appId: "",appSecret: "");  

将 appID 和 appSecret 值传递给 RegisterFacebookClient 方法,如上所述。

现在,当我们运行应用程序并单击登录按钮时,我们将看到下面的屏幕。当我们在 **AuthConfig.cs** 中输入 appID 和 AppSecret 时,应用程序会识别出我们要启用 Facebook 身份验证,并为此添加一个按钮。


这就是我们使用 Facebook 进行用户身份验证所需的所有操作。现在,我们将继续单击 Facebook 按钮。我们将被重定向到 Facebook 登录页面。

登录后,我们会收到一个警告,询问我们是否要通过我们的应用程序登录 Facebook。我们单击“转到应用”按钮。这将把我们重定向回我们的应用程序。

我们被重定向回我们的应用程序,在这里我们被要求将我们的 Facebook 帐户与我们应用程序中的用户名关联。输入您要与您的 Facebook 帐户关联的用户名。

单击“注册”后,我们将能看到我们的用户名,这意味着我们现在已经使用我们的 Facebook 凭据登录了。

现在我们的 Facebook 身份验证工作正常,让我们看看如何在我们的应用程序中检索一些 Facebook 详细信息。打开控制器目录中的 AccountController.cs 文件,然后转到 ExternalLoginCallback 方法。当使用外部提供商登录应用程序时,会调用 ExternalLogin 方法。ExternalLoginCallback 是在提供商进行身份验证后调用的回调方法。

ExternalLoginCallback 方法中的第一行是:

 AuthenticationResult AuthenticationResult  result
= OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl =
returnUrl })); 

result 变量包含一个名为 ExtraData 的字典,其中包含以下键:

  • id
  • 名称
  • link
  • gender
  • accesstoken

请注意,我们需要**访问令牌**才能访问用户帐户。因此,如果我们想要有关用户的任何其他详细信息,我们将需要使用访问令牌。

这些值是 Facebook 特定的,不同的提供商可能会返回略有不同的值。

从 Facebook 帐户检索更多信息

现在,如果我们想检索上面检索的数据之外的额外数据,我们可以使用 Facebook 客户端。由于它是一个 NuGet 包,我们可以通过以下方式安装它:

PM>Install-Package Facebook

安装后,我们可以使用以下代码非常轻松地检索用户的详细信息:

var client = new FacebookClient(HttpContext.Session["accesstoken"].ToString());
dynamic fbresult = client.Get("me");
var data = fbresult["data"].ToString();
HttpContext.Session["accesstoken"] 是分配给用户的访问令牌。使用 Facebook 客户端,我们能够检索关于用户的详细信息,这些信息可以在我们的应用程序中使用。我们可以检索用户的以下详细信息:

  • id
  • 名称
  • first_name 
  • last_name
  • link
  • 用户名
  • gender
  • timezone
  • locale
  • verified
  • updated_time

兴趣点

OAuth 允许客户端应用程序访问另一个应用程序中的用户资源。

Visual Studio 2012 附带 DotNetOpenAuth,用于 ASP.NET 应用程序中的 OAuth 身份验证。

DotNetOpenAuth 是一个开源库,用于为 Microsoft .NET Framework 添加 OpenID 和 OAuth 功能。

© . All rights reserved.