1

私は ServiceStack を理解するために数日を費やしましたが、素晴らしいと思います。唯一の問題は、多くの摩擦、ハードワーク、涙のように見える認証にあります.

MonoTouch でユーザーを登録し、ServiceStack に対して認証/OAuth に対して認証し、一般的に認証時のデータベースへの呼び出しを最小限に抑えたいと考えています。

これまでのところ、私はこれを持っています:

       var client = new JsonServiceClient(newbaseUri);

// register a new user:

        var registration  = new Registration {
            FirstName = "john"
            UserName = "user" ,
            Password = "pass",
            Email =   "john@john.com",              
        };

        var registerResponse = client.Send<RegistrationResponse>(registration);

       --------------------------------

// user registered...later on I authenticate:

        var authResponse = client.Send<AuthResponse>(new Auth {
            UserName = "user",
            Password = "pass",
            RememberMe = true
        });

        var authResponse = clientlogin.Send<AuthResponse>(auth);

        --------------------------------    

// somehow I need to store 'authresponse' for later calls, not sure how without a browser 
// tried manually setting the cookies and credentials parameters later but no joy
// but now I need to call a secured ([Authenticate] decorated) service method:

        var client = new JsonServiceClient(newbaseUri);
        var response = client.Send<HelloResponse>(new Hello { Name = "World!" });           
        return response.Result;

-----------------------------------------

// heres the configuration

        var appSettings = new AppSettings();

        //Default route: /auth/{provider}
        Plugins.Add(new AuthFeature(() => new CustomUserSession(),
            new IAuthProvider[] {
                new CredentialsAuthProvider(appSettings),  // never seems to get called
                //new FacebookAuthProvider(appSettings),    // not sure how to get this to work on monotouch
                //new TwitterAuthProvider(appSettings),    // same issue as facebook
                new BasicAuthProvider(appSettings)    // works but what about caching/tokens/cookies?
            }));

        //Default route: /register
        Plugins.Add(new RegistrationFeature());    // how do i send extra params to this as created in mongodb collection


        var mongoClient = new MongoClient("mongodb://localhost");
        var server = mongoClient.GetServer();
        var db = server.GetDatabase("users");

        container.Register<ICacheClient>(new MemoryCacheClient());
        container.Register<IUserAuthRepository>(new MongoDBAuthRepository(db, true));

私の質問は:

1) ServiceStack.Common に存在しない追加のフィールドを登録と共に渡せるようにするにはどうすればよいですか (mongodb [Servicestack.Authentication.Mongodb] には、生年月日、最初の行、都市、タイムゾーンなどの多くの空のフィールドがあるため)。 .ServiceClient.Web.Registration オブジェクト?

2) 'authresponse' で送信された Cookie (またはトークン システム) を後続の呼び出しに転送して、ServiceStack が進行中の認証のセッションと照合できるようにするにはどうすればよいですか? 「基本認証」メソッドを使用しますか (つまり、CredentialsAuthProvider はサーバー側で呼び出されません)?

助けてください...私はドキュメントを読み、テストを実行し、ソーシャルブートストラップを調べましたが、今ではこれで何日も無駄に過ごしており、SSをsimplemembershipに統合するか、古い学校のsoap/wcfのためにServiceStackを完全に捨てることさえ考えています。見た目で実装する:(

4

1 に答える 1

3

1) 登録プラグインを使用する場合、登録リクエスト/クラスが既に定義されているため、フィールドを追加することはできないと思います。独自の登録サービスを作成し、RegistrationService/Plugin を呼び出すことができます。また、この投稿が役立つ場合があります。

[Route("/myregistration")]
public class MyRegistration : Registration //Add Additional fields for registration
{
    public DateTime? BirthDate { get; set;  }
    public string Gender { get; set; } 
}

public class MyRegisterService : Service
{
    public IUserAuthRepository UserAuthRepo { get; set; }
    public object Post(MyRegistration request)
    {
        using (var registrationService = base.ResolveService<RegistrationService>())
        {
            //handle the registration 
            var response = registrationService.Post(request.TranslateTo<Registration>());
        }

        //save the additional data
        var userAuth = request.TranslateTo<UserAuth>();
        UserAuthRepo.SaveUserAuth(userAuth);

        //can make your own response or grab response from RegistrationService above    
        return new MyRegistrationResponse();
    }
}

2) JsonServiceClient を認証し、それを再利用して複数のリクエストを行うことができます。

var client = new JsonServiceClient(newbaseUri);
var authResponse = client.Send<AuthResponse>(new Auth {
    UserName = "user",
    Password = "pass",
    RememberMe = true
}); //if successful your 'client' will have a populated CookieContainer with 'ss-id' and 'ss-pid' values

//reusing 'client' (after successful authentication) to make a request
//to a service requiring authentication
var response = client.Send<HelloResponse>(new Hello { Name = "World!" });

「クライアント」を再利用できない場合は、ss-id の保存を試みることができます。MonoTouch と、それが「ブラウザー セッション」を保存する方法についてはよく知らないので、これをどのように達成するのかわかりません。ss-id を認証して保存したら、リクエスト フィルターを使用してクライアントに追加できます。

//Get ss-id value
foreach(Cookie cookie in previousAuthenticatedClient.GetCookies(new Uri(newbaseUri)))
{
    if (cookie.Name == "ss-id") 
    {
        //store ss-id 
    }
}

var newClient = new JsonServiceClient(newbaseUri)
{
    LocalHttpWebRequestFilter = (req) =>
        {
            req.CookieContainer.Add(new Uri("http://localhost:56006"), new System.Net.Cookie("ss-id", ssId));
        }
};
于 2013-04-01T06:34:59.380 に答える