OAuth和SimpleMembership - 如何从webpages_OAuthMembership表中检索ProviderUserId

时间:2013-09-15 15:11:11

标签: asp.net facebook asp.net-mvc-4 oauth

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

用户向外部提供商注册后,将在webpages_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。

必须有一种简单的方法可以做到这一点,我错过了吗?

1 个答案:

答案 0 :(得分: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

然而,这留下了webpages_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);

从webpages_OAuthMembership表中删除条目。

希望有所帮助!