1

ASP.Net MVC4 Web アプリケーションを作成しました。これには、ユーザーが Facebook や Twitter などの外部プロバイダーに登録できるテンプレート機能が含まれています。これは OAuth と SimpleMembership を使用します。私は初めて使用する Entity Framework コード ファーストを使用しているため、本当に単純なことを行うのは難しいと感じています。

ユーザーが外部プロバイダーに登録すると、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 は ProviderUserId ではなく UserId を返すだけです。

私が見逃しているこれを行う簡単な方法があるに違いありませんか?

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

ただし、これにより 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' は (UserProfile テーブルからの) UserId です。最後に 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 テーブルからエントリを削除します。

それが役立つことを願っています!

于 2014-04-10T16:58:03.360 に答える