Я провел несколько дней, пытаясь разобраться с ServiceStack, и это кажется отличным. Единственная проблема связана с аутентификацией, которая, кажется, требует много трений, тяжелой работы и слез.
Я хочу, чтобы MonoTouch регистрировал пользователей, выполнял аутентификацию в ServiceStack/аутентификацию в OAuth и, как правило, сводил к минимуму вызовы базы данных при аутентификации.
Пока у меня есть это:
var client = new JsonServiceClient(newbaseUri);
// register a new user:
var registration = new Registration {
FirstName = "john"
UserName = "user" ,
Password = "pass",
Email = "[email protected]",
};
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) Как разрешить передачу дополнительных полей вместе с регистрацией (поскольку в mongodb [Servicestack.Authentication.Mongodb] есть много пустых полей, например дата рождения, первая линия, город, часовой пояс и т. д.), которых нет в ServiceStack.Common Объект .ServiceClient.Web.Registration?
2) Как я могу передать файл cookie (или даже, возможно, систему токенов), отправленный в «авторском ответе», на последующие вызовы, чтобы позволить ServiceStack сопоставляться с сеансом для текущей аутентификации, а не с более текущими вызовами базы данных, что кажется проблемой с методом «базовой аутентификации» (т.е. CredentialsAuthProvider не вызывается на стороне сервера)?
Пожалуйста, помогите... Я прочитал документацию, провел тесты, изучил социальную загрузку, и теперь я серьезно теряю дни из-за этого и думаю об интеграции SS с простым членством или даже о полном отказе от ServiceStack для старого мыла / wcf, что намного проще реализовать судя по всему :(