【问题标题】:Storing Facebook Info in ASP.NET: Session, Cookies or Identity?在 ASP.NET 中存储 Facebook 信息:会话、Cookie 还是身份?
【发布时间】:2011-11-29 14:30:10
【问题描述】:

所以,简单的问题:

在用户授权我的应用 (OAuth 2.0) 后,我调用 Facebook Graph API 以获取他们的详细信息。

所以此时,我有他们的 Facebook ID、API 调用的访问令牌、他们的电子邮件和其他一些基本信息。

我正在开发一个 ASP.NET MVC 3 Web 应用程序,它使用表单身份验证和自定义票证来存储额外数据。

我见过的很多例子都显示了将信息存储在 Session 中。

这是明智的吗?因为我正在进行单点登录(例如,用户可以使用 Facebook Connect“登录”我的网站),所以我只有在他们已经登录到我的网站时才真正“关心”他们的 Facebook 信息。

考虑到这一点 - 我想知道是否值得在不同的持久性机制中分离信息。

例如,由于 Facebook ID 没有更改,我可以将其存储在表单身份验证票证中,并且可能将访问令牌存储在 cookie 中,并将到期时间设置为 HTTP 响应中收到的到期时间。

人们如何在 ASP.NET(MVC - 但不限于)应用程序中存储 Facebook 信息?

【问题讨论】:

  • 我现在面临着类似的问题。目前,我正在获取 Facebook 用户名(或电子邮件)并设置 FormsAuthentication.SetAuthCookie(username, true);用户名来自 Facebook。我现在想弄清楚的问题是,如果我已经有一个具有相同用户名的成员(通过 Forms Auth)会发生什么。
  • @Derek - 我使用系统的用户名作为 cookie,我目前正在使用自定义主体。所以我正在考虑将 Facebook ID 存储在主体中,并将​​访问令牌存储在 cookie 中。其余的东西(facebook 用户详细信息)可以存储在数据库中,因为我不需要在每个 HTTP 请求上都使用它。

标签: asp.net asp.net-mvc session facebook single-sign-on


【解决方案1】:

不要在会话中存储 facebook 信息。 javascript SDK 为您保存一个名为 fbsr_APP_ID 的特殊 cookie,带有一个 signed_request,因此您可以验证对您的服务器的所有请求并获取必要的信息。您可以从 javascript API 到 facebook 执行大多数 API 调用。

如果用户使用 FB.getLoginStatus 登录,您可以随时查看应用的任何页面
https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

如果用户未登录,您可以使用 FB.login 登录:https://developers.facebook.com/docs/reference/javascript/FB.login/

在会话中存储信息不是可扩展性的。它会占用您服务器上的内存等。

希望对你有帮助

编辑: 只是补充一下:不要在任何持久存储中存储除 uid 和访问令牌之外的任何信息,例如来自图形 API“我”的基本信息可能存储在数据库中。对于 UI 的需要,可以借助 XFBML 标签和 url 等在 UI 中构建名称和图片等基本内容。Javascript API 还负责保存带有 signed_request 的 cookie,该 cookie 可能会在服务器上进行验证。

【讨论】:

  • 但我没有使用(也不想)使用 JavaScript SDK。它是遗留的,您应该使用 Graph API 和 OAuth 2.0。
  • 对于这些调用,您需要一个访问令牌。您需要将其存储在某处,否则您将无法进行任何 API 调用。 JavaScript API 实际上在 2 天前已被弃用(用于身份验证)。
  • 你说的是旧的javascript SDK,新的javascript库可以使用developers.facebook.com/docs/reference/javascript
  • 我的错。你的权利。但是,我仍然使用 OAuth 服务器端,而不是 JavaScript SDK。而且我不想切换。
  • 如果您在谈论 facebook connect - 您必须使用 javascript 库,即 connect.facebook.net/en_US/all.js 等。例如 PHP SDK 使用我从 javascript 库中提到的 cookie开箱即用。
【解决方案2】:

你可以在userData中放任何你想要的东西:

 var ticket = FormsAuthenticationTicket(int version, string name, DateTime issueDate,
    DateTime expiration, bool isPersistent, string userData, string cookiePath);

【讨论】:

  • 是的 - 我知道,正如我在问题中所说的那样。
【解决方案3】:

如果您创建一个小类来保存所需的 Facebook 属性,则可以将其序列化为 Base64 编码字符串并将其存储在 FormsAuthentication Ticket(cookie)的 Roles 属性中。

【讨论】:

  • 我当时在想的是,我还使用访问令牌/ID 来确定“此用户是否已登录 facebook”。这个标志到处都在使用。因此,如果我注销 Facebook,则需要清除表单身份验证票(例如“重新”登录)。这有点傻,你不同意吗?
【解决方案4】:

我决定混合使用 Session 和 Forms Auth 票证。

在票证中,我存储了用户的 Facebook ID,因为这不会改变。

但是,我还需要存储用户当前是否已通过 Facebook 身份验证(只是一个基本标志)和 OAuth 令牌。

将这些数据存储在 cookie 中是没有意义的,因为如果他们退出 Facebook 或 OAuth 令牌过期,我将不得不更新 cookie 或将它们从表单身份验证中注销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2012-07-04
    • 2019-09-05
    相关资源
    最近更新 更多