3

OAuthWebSecurity の API には独自の認証ストアがあるように見えるため、次の行に混乱して心配しています。

        // If the current user is logged in add the new account
        OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);

上記を正しく読んでいれば、API がリレーションシップをローカルに保存していることを示しているようです。

これは事実ではないことを教えてください、そしてそれが正確に何をするのか説明してください? Web アプリケーションを可能な限りステートレスにする必要があります。このようなローカル値を API に保存することはできません。

4

1 に答える 1

5

これは、SimpleMembershipProviderASP.NET MVC 4 の既定のプロバイダーである を使用して、パブリック プロバイダーのユーザー ID とローカル ユーザーの間の関連付けを作成または更新します。基本的に、webpages_OAuthMembershipテーブルにレコードを追加します。

WebSecurity.CreateOrUpdateOAuthAccount呼び出されるからの対応するコードは次のとおりです。

public override void CreateOrUpdateOAuthAccount(string provider, string providerUserId, string userName)
{
    this.VerifyInitialized();
    if (userName.IsEmpty())
    {
        throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError);
    }
    int userId = this.GetUserId(userName);
    if (userId == -1)
    {
        throw new MembershipCreateUserException(MembershipCreateStatus.InvalidUserName);
    }
    int userIdFromOAuth = this.GetUserIdFromOAuth(provider, providerUserId);
    using (IDatabase database = this.ConnectToDatabase())
    {
        if (userIdFromOAuth == -1)
        {
            if (database.Execute("INSERT INTO [" + OAuthMembershipTableName + "] (Provider, ProviderUserId, UserId) VALUES (@0, @1, @2)", new object[] { provider, providerUserId, userId }) != 1)
            {
                throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError);
            }
        }
        else if (database.Execute("UPDATE [" + OAuthMembershipTableName + "] SET UserId = @2 WHERE UPPER(Provider)=@0 AND UPPER(ProviderUserId)=@1", new object[] { provider, providerUserId, userId }) != 1)
        {
            throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError);
        }
    }
}
于 2013-01-28T07:33:47.960 に答える