Добрый день!
Пытаюсь подключиться к приложению 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
Нравится
Здравствуйте!
Прикрепите пожалуйста свой проекта на 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
В ближайшее время статью на академии исправлю
Большое спасибо! все отработало корректно!