我创建了一个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。
必须有一种简单的方法可以做到这一点,我错过了吗?
答案 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表中删除条目。
希望有所帮助!