Аутентификация внешних запросов

Добрый день!

Пытаюсь подключиться к приложению bpmonline из стороннего приложения, а точнее из простого консольного приложения(c#). Действую согласно инструкции.
https://academy.terrasoft.ru/documents/technic-sdk/7-9/autentifikaciya-v...
Проблема в том, что какие бы я не указывала userName и userPassword, метод TryLogin мне всегда возвращает true, хотя через UI я не могу подключиться используя эти же учетные данные. То есть если я указываю корректные данные пользователя bpmonline, то метод tryLogin возвращает true и если я указываю произвольный набор символов в качестве логина и пароля, например, 123 и 321, то метод тоже возвращает true

При попытке вызвать метод в строке браузера (http://адрес приложения>/ServiceModel/AuthService.svc/Login) выходит сообщение "Метод не разрешен".

При этом при создании записи из стороннего приложения https://academy.terrasoft.ru/documents/technic-sdk/7-9/dataservice-sozda... если логин/пароль неверны, то создание не проходит, при этом tryLogin все так же возвращает true. Если логин/пароль верны, то создание проходит корректно.

Подскажите, пожалуйста, в чем может быть проблема?
Версия 7.9.0.1228

Нравится

6 комментариев

Здравствуйте!

Прикрепите пожалуйста свой проекта на VS или пример кода.

"Терещук Павел" написал:

Здравствуйте!

Прикрепите пожалуйста свой проекта на VS или пример кода.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Terrasoft.Nui.ServiceModel.DataContract;
using Terrasoft.Core.Entities;
using System.Web.Script.Serialization;
using Terrasoft.Common;

namespace trsftTestApp
{
class Program
{
private const string baseUri = "http://192.168.126.72:81";

// Cookie аутентификации bpm'online.
public static CookieContainer AuthCookie = new CookieContainer();
// Строка запроса к методу Login сервиса AuthService.svc.
private const string authServiceUri = baseUri + @"/ServiceModel/AuthService.svc/Login";

static void Main(string[] args)
{
Console.WriteLine(TryLogin("xxxxxxx", "xxxxxxxx"));

}
public static bool TryLogin(string userName, string userPassword)
{
// Создание экземпляра запроса к сервису аутентификации.
var authRequest = HttpWebRequest.Create(authServiceUri) as HttpWebRequest;
// Определение метода запроса.
authRequest.Method = "POST";
// Определение типа контента запроса.
authRequest.ContentType = "application/json";

// Включение использования cookie в запросе.
authRequest.CookieContainer = AuthCookie;

// Помещение в тело запроса учетной информации пользователя.
using (var requesrStream = authRequest.GetRequestStream())
{
using (var writer = new StreamWriter(requesrStream))
{
writer.Write(@"{
""UserName"":""" + userName + @""",
""UserPassword"":""" + userPassword + @"""
}");
}
}
// Получение ответа от сервера. Если аутентификация проходит успешно, в свойство AuthCookie будут
// помещены cookie, которые могут быть использованы для последующих запросов.
using (var response = (HttpWebResponse)authRequest.GetResponse())
{
if (AuthCookie.Count > 0)
{
return true;
}
}
return false;
}

}

}

Здравствуйте!

Исправьте условие с if (AuthCookie.Count > 0) на if (AuthCookie.Count > 1)

Здравствуйте
Ориентироваться на количество кук мягко говоря не совсем корректно
Нужно анализировать JSON - объект, который приходит в теле ответа
А именно его свойство Code
Если Code==0, то аутентификация успешна
Иначе ошибка, текст которой можно узнать из свойства Message
В ближайшее время статью на академии исправлю

Привожу правильный исходный код аутентификации для вашего примера
Не забудьте добавить библиотеку System.Web.Extensions в зависимости проекта. Она нужна для парсинга JSON-объекта в ваш экземпляр ResponseStatus

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
//using Terrasoft.Nui.ServiceModel.DataContract;
using Terrasoft.Core.Entities;
//using System.Web.Script.Serialization;
using Terrasoft.Common;
 
namespace trsftTestApp
{
    class ResponseStatus
    {
        public int Code { get; set; }
        public string Message { get; set; }
        public object Exception { get; set; }
        public object PasswordChangeUrl { get; set; }
        public object RedirectUrl { get; set; }
    }
 
    class Program
    {
        private const string baseUri = "http://localhost/bpmonline-7.9.1";
 
        // Cookie аутентификации bpm'online.
        public static CookieContainer AuthCookie = new CookieContainer();
        // Строка запроса к методу Login сервиса AuthService.svc.
        private const string authServiceUri = baseUri + @"/ServiceModel/AuthService.svc/Login";
 
        static void Main(string[] args)
        {
            Console.WriteLine(TryLogin("Supervisor", "Supervisor_1"));
            Console.ReadLine();
 
        }
        public static bool TryLogin(string userName, string userPassword)
        {
            // Создание экземпляра запроса к сервису аутентификации.
            var authRequest = HttpWebRequest.Create(authServiceUri) as HttpWebRequest;
            // Определение метода запроса.
            authRequest.Method = "POST";
            // Определение типа контента запроса.
            authRequest.ContentType = "application/json";
 
            // Включение использования cookie в запросе.
            authRequest.CookieContainer = AuthCookie;
 
            // Помещение в тело запроса учетной информации пользователя.
            using (var requesrStream = authRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requesrStream))
                {
                    writer.Write(@"{
""UserName"":""" + userName + @""",
""UserPassword"":""" + userPassword + @"""
}");
                }
            }
            // Получение ответа от сервера. Если аутентификация проходит успешно, в свойство AuthCookie будут
            // помещены cookie, которые могут быть использованы для последующих запросов.
            ResponseStatus status = null;
            using (var response = (HttpWebResponse)authRequest.GetResponse())
            {
                using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    string responseText = reader.ReadToEnd();
                    status = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<ResponseStatus>(responseText);
                }
 
            }
            if (status!=null)
            {
                if (status.Code == 0)
                {
                    return true;
                }
 
                Console.WriteLine(status.Message);
            }
            return false;
        }
 
    }
 
}

"Терещук Павел" написал:

Здравствуйте!

Исправьте условие с if (AuthCookie.Count > 0) на if (AuthCookie.Count > 1)


Ваш вариант работает. Спасибо!
Подскажите, пожалуйста, почему не работал мой исходный вариант - почему хотя бы одна кука возвращается даже при неуспешной аутентификации? Это особенность terrasoft?
Я брала пример из официальной документации на академии https://academy.terrasoft.ru/documents/technic-sdk/7-9/autentifikaciya-…

"Роман Симута" написал:Здравствуйте
Ориентироваться на количество кук мягко говоря не совсем корректно
Нужно анализировать JSON - объект, который приходит в теле ответа
А именно его свойство Code
Если Code==0, то аутентификация успешна
Иначе ошибка, текст которой можно узнать из свойства Message
В ближайшее время статью на академии исправлю

Большое спасибо! все отработало корректно!

Показать все комментарии