2

servicestack OAuth実装では、たとえば. Facebookのアカウント。

しかし、Facebookログインで登録プロセスをサポートする能力はありますか. 私が望んでいたのは、ユーザーがFacebookアプリにログインできるようにしてから、名前、姓、電子メールをロードし、サイトでの実際の登録に必要なテキストボックスを事前に入力できるようにすることです(携帯電話の確認なども必要なので)。ユーザーが facebook でログインするときに承認および認証されるようにします。完全なサイト アクセスには資格情報ログインのみが有効である必要があります。

編集:解決策を見つけました。

FacebookProvider.cs 内

public override bool IsAuthorized(IAuthSession session, IOAuthTokens tokens, Auth request = null)
{
    if (request != null)
    {
        if (!LoginMatchesSession(session, request.UserName)) return false;
    }
    return tokens != null && session.UserName!=null && !string.IsNullOrEmpty(tokens.AccessTokenSecret);
}

問題は&& session.UserName!=null部分でした。したがって、ユーザーが資格情報を使用してログインしているかどうかを確認できます。これは !=null になり、ユーザーはすべてのサービスを使用できます。そうでない場合、これは ==null になり、セッションからのみ Facebook 情報を取得できます。

4

1 に答える 1

4

SocialBootstrap APIプロジェクトは、カスタム ユーザー セッションの OnAuthenticated() フックをオーバーライドすることで、認証が成功した後にコールバックを処理する例を示しています。

私は引き出して、いくつかを書き直し、いくつかの重要な部分を強調しました:

public class CustomUserSession : AuthUserSession
{
    public override void OnAuthenticated(IServiceBase authService, 
                    IAuthSession session, 
                    IOAuthTokens tokens, 
                    Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);

        //Populate matching fields from this session into your own MyUserTable
        var user = session.TranslateTo<MyUserTable>();
        user.Id = int.Parse(session.UserAuthId);
        user.GravatarImageUrl64 = CreateGravatarUrl(session.Email, 64);

        foreach (var authToken in session.ProviderOAuthAccess)
        {
            if (authToken.Provider == FacebookAuthProvider.Name)
            {
                user.FacebookName = authToken.DisplayName;
                user.FacebookFirstName = authToken.FirstName;
                user.FacebookLastName = authToken.LastName;
                user.FacebookEmail = authToken.Email;
            }
            else if (authToken.Provider == TwitterAuthProvider.Name)
            {
                user.TwitterName = authToken.DisplayName;
            }
        }

        //Resolve the DbFactory from the IOC and persist the user info
        using (var db = authService.TryResolve<IDbConnectionFactory>().Open())
        {
            //Update (if exists) or insert populated data into 'MyUserTable'
            db.Save(user);
        }

    }

    //Change `IsAuthorized` to only verify users authenticated with Credentials
    public override bool IsAuthorized(string provider)
    {
        if (provider != AuthService.CredentialsProvider) return false;
        return base.IsAuthorized(provider);
    }
}

基本的に、このユーザー定義のカスタム ロジック (認証が成功するたびに起動される) は、UserSession からデータを抽出し、それをカスタム 'MyUserTable' に格納します。

IsAuthorizedまた、CredentialsAuth で認証されたユーザーのみを受け入れるという意味をオーバーライドしました。

このデータを使用して、残りの登録を完了することができます。

その他の可能なカスタマイズ

ServiceStack の組み込み Auth は AuthData を保持し、Session を自動的に設定します。追加の検証アサーションを追加する場合は、追加のカスタム ロジックを含める代わりに、独自のカスタム [Authentication] 属性を使用できます。組み込みのAuthenticateAttributeの実装を参考にしてください。

于 2012-09-14T22:35:28.447 に答える