1

SocialBootstrapApi の例に従って、4 つのプロバイダー (Facebook、Twitter、GoogleOpenId、および YahooOpenId) のみを使用して Web アプリの認証を設定しようとしています。また、ユーザーのメタデータ (FacebookUserName など) をカスタム スキーマに格納したいと考えています (ユーザー テーブルは既存のものです)。

登録サービスは必要ですか?OAuth でユーザーを認証し、データを新しいユーザーとしてすぐに保存することをお勧めします (2 ステップの登録と認証プロセスを使用するのではなく)。

次のコードを試しましたが、AuthService の URL に GET または POST すると、エラーが発生します。

Handler for Request not found: 


Request.ApplicationPath: /
Request.CurrentExecutionFilePath: /api/auth/googleopenid
Request.FilePath: /api/auth/googleopenid
Request.HttpMethod: GET
...

AppHost.cs

public class AppHost : AppHostBase {
    public AppHost() : base("...", typeof(HelloService).Assembly) { }

    public override void Configure(Container container) {
        container.Register<ICacheClient>(new MemoryCacheClient());

        ConfigureAuth(container);
        ConfigureRoutes();

        ControllerBuilder.Current.SetControllerFactory(new FunqControllerFactory(container));
        ServiceStackController.CatchAllController = reqCtx => container.TryResolve<HomeController>();
    }

    void ConfigureAuth(Container container) {
        var appSettings = new AppSettings();

        Plugins.Add(new AuthFeature(
            () => new CustomUserSession(),
            new IAuthProvider[] {
                new TwitterAuthProvider(appSettings),
                new FacebookAuthProvider(appSettings),
                new GoogleOpenIdOAuthProvider(appSettings),
                new YahooOpenIdOAuthProvider(appSettings)
            }));
    }

    void ConfigureRoutes() {
        Routes
            .Add<Hello>("/hello")
            .Add<Hello>("/hello/{Name*}")
        ;
    }

    public static void Start() {
        new AppHost().Init();
    }
}

CustomUserSession.cs

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

        var user = session.TranslateTo<User>();
        user.ID = long.Parse(session.UserAuthId);
        user.GravatarUrl64 = !session.Email.IsNullOrEmpty()
            ? CreateGravatarUrl(session.Email)
            : null;

        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;
            } else if (authToken.Provider == GoogleOpenIdOAuthProvider.Name) {
                user.GoogleUserId = authToken.UserId;
                user.GoogleFullName = authToken.FullName;
                user.GoogleEmail = authToken.Email;
            } else if (authToken.Provider == YahooOpenIdOAuthProvider.Name) {
                user.YahooUserId = authToken.UserId;
                user.YahooFullName = authToken.FullName;
                user.YahooEmail = authToken.Email;
            }
        }

        authService.TryResolve<IDbConnectionFactory>().Run(db => db.Save(user));
    }

Web.config

<appSettings>
  <add key="oauth.facebook.Permissions" value="email,read_stream,offline_access" />
  <add key="oauth.facebook.AppId" value="..." />
  <add key="oauth.facebook.AppSecret" value="..." />
  <add key="oauth.facebook.RedirectUrl" value="http://localhost:3000" />
  <add key="oauth.facebook.CallbackUrl" value="http://localhost:3000/api/auth/facebook" />

  <add key="oauth.twitter.ConsumerKey" value="..." />
  <add key="oauth.twitter.ConsumerSecret" value="..." />
  <add key="oauth.twitter.RedirectUrl" value="http://localhost:3000" />
  <add key="oauth.twitter.CallbackUrl" value="http://localhost:3000/api/auth/twitter" />

  <add key="oauth.GoogleOpenId.RedirectUrl" value="http://localhost:3000" />
  <add key="oauth.GoogleOpenId.CallbackUrl" value="http://localhost:3000/api/auth/googleopenid" />

  <add key="oauth.YahooOpenId.RedirectUrl" value="http://localhost:3000" />
  <add key="oauth.YahooOpenId.CallbackUrl" value="http://localhost:3000/api/auth/yahooopenid" />
</appSettings>
4

1 に答える 1

1

それを理解しました-NuGet経由でServiceStackをインストールしましたが、そのパッケージには独自のAppHost実装が含まれています。簡単に言うと、上記の Configure() メソッドは実際には呼び出されていませんでした。

関連する質問/回答は次のとおりです。

サービス スタック/MVC:「AppHostBase.Instance は既に設定されています」エラー - しかし、理由/防止方法を理解できません

于 2013-06-03T01:02:27.603 に答える