OAuth的和SimpleMembership - 如何从webpages_OAuthMembership表中检索ProviderUserId [英] OAuth and SimpleMembership - how to retrieve ProviderUserId from webpages_OAuthMembership table

查看:241
本文介绍了OAuth的和SimpleMembership - 如何从webpages_OAuthMembership表中检索ProviderUserId的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建一个ASP.Net MVC4 Web应用程序,它包括了模板功能,允许用户与外部供应商,如Facebook和Twitter注册。这使用OAuth和SimpleMembership。我使用实体框架code-第一,我是新来的,所以我发现很难做的很简单的东西。

I've created an ASP.Net MVC4 web application and it includes the templated functionality that allows users to register with external providers such as Facebook and Twitter. This uses OAuth and SimpleMembership. I'm using Entity Framework code-first, which I'm new to, so I'm finding it difficult to do something really simple.

一旦用户与外部供应商注册,记录在webpages_OAuthMembership创造了场提供商,ProviderUserId和用户ID。用户ID映射到在用户配置表用户ID。我如何读ProviderUserId身份验证的用户?我就需要为与FB.api使用和其他像检索利用用户的照片https://graph.facebook.com/ [ProviderUserId] /图片?类型=小。

Once the user has registered with the external provider, a record is created in webpages_OAuthMembership with fields Provider, ProviderUserId and UserId. UserId maps to UserId in the UserProfile table. How do I read the ProviderUserId for the authenticated user? I need it to for use with the FB.api and for other things like retrieving the user photo using https://graph.facebook.com/[ProviderUserId]/picture?type=small.

我已经试过这样:

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

但ProviderUserKey仅返回用户ID,而不是ProviderUserId。

but ProviderUserKey just returns the UserId rather than ProviderUserId.

有必须是一个简单的方法来做到这一点,我失踪?

There must be a simple way to do this that I'm missing?

推荐答案

这个回答假设使用实体框架6 code第一种方法(尽管所有的code应该与早期版本的EF的工作)。

This answer assumes using Entity Framework 6 Code First approach (although all the code should work with earlier versions of EF).

我是有访问提供商和ProviderUserId太多的问题。我试图删除通过OAuth认证的用户帐户。我能够从与code删除数据库中的实际用户帐户:

I was having issues with accessing Provider and ProviderUserId too. I was attempting to delete a user accounts that authenticated with OAuth. I was able to delete the actual user account from the database with the code:

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

不过,这留在webpages_OAuthMembership表中的条目(我想删除!)。

However, this left the entry in the webpages_OAuthMembership table (which I wanted to delete!).

要解决这个问题,我做了一类具有相同的名称db表:

To solve this, I made a class with the same name as the db table:

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; }
}

重点和列数据注解让EF知道,供应商和ProviderUserId形成复合键(我认为SQL Server调用它聚集PK)。不管怎么说,在初始化数据库中的DbContext类,我没有上一流的DbSet:

The Key and Column data annotations let EF know that Provider and ProviderUserId form a composite key (I think SQL Server calls it a clustered PK). Anyways, in the DbContext class that initializes the database, I did a DbSet on that class:

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

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

This now allows you to access the OAuth table in the database in your code

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

有关你的情况,得到ProviderUserId,你可以使用下面的code

For your case, to get the ProviderUserId, you could use the following code

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

其中userIdOfUserYouAreSearchingFor是用户ID(从用户配置表)。确保对最终的FirstOrDefault。这样一来,如果在数据库中该用户ID尤其没有进入,它会收到空,您可以重新检查。

where 'userIdOfUserYouAreSearchingFor' is the UserId (from UserProfile table). Make sure to have the FirstOrDefault on the end. That way, if there is no entry in the database for that particular UserId, it will receive null and you can check again that.

现在在我的情况,我想删除所述表项。万一别人遇到这个问题,我将包括信息了。
我用这个code

Now in my case, I wanted to delete entries from said table. Just in case anyone else comes across this, I will include that info too. I used this code

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表中删除的条目。

to delete entries from the webpages_OAuthMembership table.

希望帮助!

这篇关于OAuth的和SimpleMembership - 如何从webpages_OAuthMembership表中检索ProviderUserId的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆