Nano Hash - криптовалюты, майнинг, программирование

Как MonoTouch может предоставлять файлы cookie для каждого запроса ServiceStack?

Я провел несколько дней, пытаясь разобраться с 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, что намного проще реализовать судя по всему :(


  • Хорошо, удалось заставить файлы cookie работать, скопировав cookie-контейнер объекта ответа в JsonServiceClient следующего запроса перед доступом к другому методу (Q2).... Тем не менее Q1 остался без ответа :( 31.03.2013

Ответы:


1

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));
        }
};
01.04.2013
  • Спасибо paaschpa! Я получил файл cookie, работающий с использованием образца CustomAuthenticate из репозитория ServiceStack github и копирования файла cookie из одного запроса в другой (аналогично тому, что вы описали). Теперь, прочитав ваш ответ, я немного лучше понимаю процесс регистрации - я поэкспериментирую и вернусь в эту ветку, чтобы сообщить ... большое спасибо ... у меня снова есть надежда: D 01.04.2013
  • Я столкнулся с этой же проблемой при создании прототипа приложения для iPad. Я собирался сохранить ss-id в файле в файловой системе песочницы iOS, чтобы при повторном посещении приложения можно было получить файл cookie и добавить его в контейнер. 16.05.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..