1

我创建了一个 ASP.Net MVC4 Web 应用程序,它包含模板化功能,允许用户向 Facebook 和 Twitter 等外部提供商注册。这使用 OAuth 和 SimpleMembership。我使用的是实体框架代码优先,我是新手,所以我发现很难做一些非常简单的事情。

一旦用户向外部提供商注册,就会在 pages_OAuthMembership 中创建一条记录,其中包含 Provider、ProviderUserId 和 UserId 字段。UserId 映射到 UserProfile 表中的 UserId。如何读取经过身份验证的用户的 ProviderUserId?我需要它与 FB.api 一起使用,以及用于其他用途,例如使用 https://graph.facebook.com/[ProviderUserId]/picture?type=small 检索用户照片。

我试过这个:

SimpleMembershipProvider provider = (SimpleMembershipProvider)Membership.Provider;
string providerUserId = provider.GetUser("[username]",  true).ProviderUserKey.ToString();

但 ProviderUserKey 只返回 UserId 而不是 ProviderUserId。

必须有一个简单的方法来做到这一点,我错过了?

4

1 回答 1

1

此答案假定使用 Entity Framework 6 Code First 方法(尽管所有代码都应适用于早期版本的 EF)。

我在访问 Provider 和 ProviderUserId 时也遇到了问题。我试图删除通过 OAuth 进行身份验证的用户帐户。我能够使用以下代码从数据库中删除实际的用户帐户:

((SimpleMembershipProvider)Membership.Provider).DeleteAccount(selectedUser); // deletes record from webpages_Membership table
((SimpleMembershipProvider)Membership.Provider).DeleteUser(selectedUser, true); // deletes record from UserProfile table

但是,这留下了 pages_OAuthMembership 表中的条目(我想删除它!)。

为了解决这个问题,我创建了一个与 db 表同名的类:

public class webpages_OAuthMembership
{
    [Key, Column(Order=0)]
    public string Provider { get; set; }
    [Key, Column(Order = 1)]
    public string ProviderUserId { get; set; }
    public int UserId { get; set; }
}

Key 和 Column 数据注释让 EF 知道 Provider 和 ProviderUserId 形成一个复合键(我认为 SQL Server 将其称为集群 PK)。无论如何,在初始化数据库的 DbContext 类中,我对该类做了一个 DbSet:

public DbSet<webpages_OAuthMembership> webpages_OAuthMembership { get; set; }

这现在允许您在代码中访问数据库中的 OAuth 表

var db = new DbContext();  db.webpages_OAuthMembership.ToList();
// this would give you all entries in the OAuth table

对于您的情况,要获取 ProviderUserId,您可以使用以下代码

var OAuthAccount = db.webpages_OAuthMembership.Where(u => u.UserId == userIdOfUserYouAreSearchingFor).FirstOrDefault;
// ProviderUserId would be OAuthAccount.ProviderUserId

其中 'userIdOfUserYouAreSearchingFor' 是 UserId(来自 UserProfile 表)。确保最后有 FirstOrDefault。这样,如果数据库中没有该特定 UserId 的条目,它将收到 null 并且您可以再次检查。

现在就我而言,我想从所述表中删除条目。以防万一其他人遇到此问题,我也会包含该信息。我用了这段代码

var OAuthAcct = ((SimpleMembershipProvider)Membership.Provider).GetAccountsForUser(selectedUser).ToList();
var provider = OAuthAcct[0].Provider;
var providerUserId = OAuthAcct[0].ProviderUserId;
((SimpleMembershipProvider)Membership.Provider).DeleteOAuthAccount(provider, providerUserId);

从 pages_OAuthMembership 表中删除条目。

希望有帮助!

于 2014-04-10T16:58:03.360 回答