Вопрос

Добрый день, Коллеги!

Изучили ряд тем на сообществе по данному вопросу и попробовали воспроизвести кейс из данной темы:

https://community.terrasoft.ru/questions/anonimnaa-autentifikacia-vnesn…

Сделали всё в точности как описано в примере, включая настройку web-конфигов. 

Сервис:

namespace Terrasoft.Configuration
{
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Data;
 using System.Linq;
 using System.Security;
 using System.ServiceModel;
 using System.ServiceModel.Web;
 using System.ServiceModel.Activation;
 using System.Web;
 using Terrasoft;
 using Terrasoft.Common;
 using Terrasoft.Common.Json;
 using Terrasoft.Core;
 using Terrasoft.Core.DB;
 using Terrasoft.Core.Entities;
 using Terrasoft.Core.Store;
 using Newtonsoft.Json;
 
 using Terrasoft.Web.Common;
 
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrGreetingService : BaseService //,System.Web.SessionState.IReadOnlySessionState
    {
 
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "Hello", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public string TestHello()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
 
        [OperationContract]
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
        public string TestHelloXml()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        public string TestPostJson()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
 
 
 
 //       private UserConnection _userConnection;
  /// <summary>
  /// </summary>
// private UserConnection UserConnection {
//  get {
//   return _userConnection ?? (_userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection);
 //  }
// }
    }
}

 

В результате попробовали отправить запрос через POSTMAN

1) Если указать метод GET без авторизационных Cookie, то всё работает

Как пример можно получить результат запроса по ссылке:

http://93.188.21.108:2022/0/ServiceModel/UsrGreetingService.svc/Hello

 

2) Указываем метод POST без авторизационных Cookie, то получаем 403:

 

 

Если же добавить к запросу(метод POST) авторизационные Cookie, то всё работает...

Коллеги, прошу подсказать, что именно делаем не так?

 

У меня такой же вопрос

2 комментария

Добрый день, 

Проверьте включена ли на сайте CSRF-защита. В внешнем и внутреннем Web.config есть атрибут UseCsrfToken, содержит значение true то можно поступить следующим образом: 

1. Изменить значение UseCsrfToken в Web.config и WebApp/Web.config на 

<add key="UseCsrfToken" value="false" />

2. В хедере запроса отправлять Csrf-токен. Следующим образов (в случае безавторизационного сервиса, авторизацитонные куки можно не отправлять):

Tsopa,

Спасибо большое! Решили проблему получением и отправкой

авторизацитонных куков!

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Коллеги, всем добрый день!

Может кто-нибудь сталкивался с требованием заказчика сделать доступ к Redis закрытым, т.е. установить пароль на доступ.

На стороне redis, насколько я понимаю, нужно включить в redis.conf настройку requirepass, а как реализовать это на стороне нашего приложения? В ТП ответили так: "поскольку это стороннее ПО, с данным вопросом обратитесь к поставщику продукта redis. Мы предоставляем поддержку продукта bpm'online."

У меня такой же вопрос

3 комментария

попробуйте по аналогии с ConnectionString из StackExchange

<add name="redis" connectionString="name=user;password=123;host=localhost;db=1;port=6379;maxReadPoolSize=25;maxWritePoolSize=25" />

в любом случае дайте знать получилось или нет :)

Севостьянов Илья Сергеевич,

Илья, спасибо за ответ, но, к сожалению, система с настроенными подобным образом конфигами даже не запускается.

Илья, моему коллеге удалось найти ответ на данный вопрос:
<add name="redis" connectionString="host=password@127.0.0.1;db=1;port=6379;maxReadPoolSize=25;maxWritePoolSize=25" />

ответ был найден здесь: https://stackoverflow.com/questions/8862552/authenticated-servicestack-…

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день, сегодня ночью BPMonline обновилась до версии 7.10 и перестала работать авторизация: 403 - Forbidden: Access is denied. You do not have permission to view this directory or page using the credentials that you supplied.
Раньше осуществляли авторизацию по примеру из данной темы (http://www.community.terrasoft.ru/forum/topic/9613).
Можете, пожалуйста скинуть пример авторизации на php c добавлением CSRF-токена в заголовок запроса.

У меня такой же вопрос

3 комментария

Здравствуйте, Мария!

Готового запроса нет - его нужно писать. Если у вас получится, пожалуйста, поделитесь.

Спасибо за ответ.
получилось подкорректировать POST запрос, добавили вытягивание токена из файла:

$file = "cookie.txt";
$lines = file( $file ); 
$str =  $lines[6]; 
$prefix = "BPMCSRF";
$index = strpos($str, $prefix) + strlen($prefix);
$token = trim(substr($str, $index));

и добавили в заголовок:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;odata=verbose',
		'BPMCSRF:' .  $token,
        'Content-Length: ' . strlen($json))
);

После обновления необходимо теперь добавить CSRF токен
Есть пакет который уже предоставляет интерфейс для BPM

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Существует необходимость использования веб-сервисов приложения из клиентского кода JavaScript некоторого корпоративного портала. (т.е. из браузера - клиентский JS)
Обращению к сервису авторизации в данном случае препятствует технология CORS (Cross-origin resource sharing)
В попытках разрешить возникшую проблемную ситуацию были проделаны следующие действия, в файл
web.config (В корне сайта BPMOnline) в соответствующую директиву system.webServer
добавлены CORS-Allow-Access заголовки:

       
           
               
               
               
               
           

       

В конечном итоге - запрос OPTIONS к серверу на разрешение осуществления кросс-доменного запроса проходит, ответ содержит необходимые заголовки:

но, запрос все равно не осуществляется, происходит ошибка:
FF:
GH:

Происходит это по причине того, что обращение запроса OPTIONS на Login.aspx в конечном итоге разрешается ответом с кодом состояния HTTP 302 (Ресурс временно перемещен) и перенаправляет на
/NuiLogin.aspx?ReturnUrl=%2f0%2fServiceModel%2fAuthService.svc%2fLogin
Поиск по разрешению вопросов данной ошибки, в основном сводится к описанию случаев когда целевой сервер принимающий кросс-доменные запросы находится за Mirror Proxy или по запросу осуществляется редирект (Это как раз наш случай)
Но явного решения для данного вопроса, особенно в случае с веб-сервером IIS 7-8.5 найти не удалось, да и он в первую очередь лежит в плоскости логики работы самого ASP-приложения.

Прошу помощи у коллективного разума - что еще можно попробовать сделать для решения данной задачи ?
Возможно все таки кто-то уже имел опыт работы с веб-сервисами BPMOnline из клиентского кода JavaScript исполняемого в браузере. (Для веб-сервисов возможность такого взаимодействия кажется чуть ли не основополагающей).

У меня такой же вопрос

3 комментария

Добрый день, Илья.

К сожалению, на данный момент вызвать web сервис из клиентского кода другого приложения у Вас не выйдет. Рекомендую Вам смотреть в сторону вызова из Node.js или же сервиса, написанного на .Net.

Очень жаль...
Это открыло бы массу возможностей как для интеграции так и для сценариев использования.

Мотков Илья,

В 7.12 такая возможность появилась? как настроить?

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Коллеги, приветствую.

Собственно вопрос - как разрешить удаленный вызов процедур Web- сервиса? Есть простой WCF Web- сервис, на его основе получен WSDL, из которого сгенерированы прокси- классы. Эти прокси- классы использует простой консольный клиент, например, просто вернуть строку с сервера - вылетает окно:

Судя по ссылке, запрос не проходит авторизацию, хотя в Terrasoft.WebApp\Web.config указано, что:

 
   
     
       
     

   

 

Как отключить авторизацию для RPC?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

У меня такой же вопрос

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

Переехали решать задачу в рамках технической поддержки:smile:

Здравствуйте, Алексей! Спасибо! :smile:

Вот некоторые подробности.

1. В \Terrasoft.WebApp\ServiceModel добавил UsrService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.WebApp.ServiceModel.UsrService" CodeBehind="UsrService.svc.cs" %>

2. В \Terrasoft.WebApp\Web.config добавил:

  <appSettings>
    ...
    <add key="AllowedLocations" value="...;ServiceModel/UsrService.svc"/>
   ...
  </appSettings>
 
  ...
 
  <location path="ServiceModel/UsrService.svc">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
   ...

Контракт Web- сервиса в конфигурации (UsrIService.svc):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SimpleCustomService
{
    [ServiceContract]
    public interface UsrIService
    {
        [OperationContract]
        string SPMClientInfo();
    }
}

Реализация Web- сервиса в конфигурации (UsrService.svc):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SimpleCustomService
{
    public class UsrService : UsrIService
    {
        public string SPMClientInfo()
        {
            return "test string";
        }
    }
}

В \Terrasoft.WebApp\ServiceModel\http\services.config добавил:

...
 	<service behaviorConfiguration="BaseServiceBehavior" name="SimpleCustomService.UsrService">
        	<endpoint name="UsrServiceEndPoint"
           		binding="webHttpBinding"
           		behaviorConfiguration="RestServiceBehavior"
           		bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
           		contract="SimpleCustomService.UsrIService" />
	        <endpoint address="soap" binding="basicHttpBinding" contract="SimpleCustomService.UsrIService"/>
	        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    	</service>
...

Нашел вот статью, попробую сделать как там описано. Аутентификация внешних запросов к веб-сервисам bpm'online

Отличная статья, как я теперь могу вызвать метод Web- сервиса, используя AuthCookie? Должен- ли я менять код Web- сервиса, чтобы аутентифицировать внешние запросы?

Здравствуйте.
Обратите внимание на ресурс: http://stackoverflow.com/questions/16028014/how-can-i-pass-a-username-p…

Здравствуйте, Александр! Спасибо большое за ответ, попробую сделать так.

Возвращаясь к началу, хочу отметить одну интересную деталь - если в Visual Studio попытаться добавить ссылку на WSDL (Add Web Reference), то получим такое вот окно:

URL тот же самый, что и в консоли:

http://localhost:8080/NuiLogin.aspx?ReturnUrl=%2f0%2fServiceModel%2fSimpleCustomService.svc

Здравствуйте, Алексей!

Даже если сделать так?

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!
Такая ситуация:

1) Настроена синхронизация с LDAP, пользователи и контакты добавляются, лицензии назначены, но в систему войти под доменныйм паролем не удается. Неверное имя пользователя, причем если через базу сделать update пароля для LDAP-пользователя (ну взять от suervisor например), то система радостно запускает сотрудника.

2) Для импортируемых иp LDAP пользователей контрагент автоматически проставляется, а должность и тип "Сотрудник" нет.

Подскажите, в какую сторону копать?
Спасибо

У меня такой же вопрос

2 комментария

Здравствуйте.
1) При LDAP-авторизации BPM'online проверяет пароль не в базе данных, а обращается к домену и если получает ответ, что учётные данные пользователя корректны - разрешает вход в систему. Для возможности LDAP-авторизации нужно кроме настройки синхронизации, добавить в конфигурационный файл web.config (находится в корне директории с файлами сайта) провайдер авторизации - Ldap (важен регистр).
Пример:

 <auth providerNames="InternalUserPassword,Ldap"

2) Для того, что бы проставлялась должность, точно такое же название должно быть в справочнике должностей. Что касается тип "Сотрудник" у контакта пользователя, то это не является обязательным условием для возможности авторизации.

Спасибо, Александр.
Добавление auth providerNames="InternalUserPassword,Ldap" решило все вопросы.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день. немогу выполнить вход в терасофт появляется окно дебагера скрин

У меня такой же вопрос

3 комментария

Мне кажется, для начала нужно почистить профиль и кэш:

  • Закрыть Terrasoft
  • Удалить содержимое папки %appdata%\Terrasoft\3.4.0\Profile\
  • Удалить содержимое папки %appdata%\Terrasoft\3.4.0\Cache\
  • Запустить Terrasoft

"Зверев Александр" написал:

Мне кажется, для начала нужно почистить профиль и кэш:

  • Закрыть Terrasoft
  • Удалить содержимое папки %appdata%\Terrasoft\3.4.0\Profile\
  • Удалить содержимое папки %appdata%\Terrasoft\3.4.0\Cache\
  • Запустить Terrasoft

выполнено, не помогает

А что будет, если не запускать отладчик, а продолжить выполнение? До открытия главного окна дойдёт?

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

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

При попытке авторизации выдается сообщение "Ошибка авторизации"

в строке адреса

http://192.168.0.77:7000/?DisableAutoLogin=&ReturnUrl=%2f0%2fNui%2fViewModule.aspx&ErrorCode=0

В отладчике на вкладке сеть

http://softex-iis:7000/0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&ActiveTabId=PageContainer_c02e0ec6f36b14108882485b39c5f8dd_045063c98180e011afbc00155d04320c_7c0581929880e011afbc00155d04320c

Status Code:302 Found
Request Headersview source

Set-Cookie:.ASPXAUTH=AC0D8B61C22BBBB6D5ECC984350B184A2A56C93B59107CAEE771322332F36565625F4131E70D3B79D2E85950C877DD281B2FE2F93720AC6BEF76C2C813189EC3716130B5FF183264EFEC13D3C9D6CFBE32B3B3186FDE99C6FF2C61C1D06EAF1D20ED5D6C0B203E3EFA1F10F469305BFE70963A009067170D19AB9A174868DFA221F55A8F0513C360A8A9DB3C75EF492888DB35B6BA7B7774111CAE4AC563DEF1B7773E9449B062CBECC487D6C0223D7B24DBD4060E77157DBEFD66E7B98005D79F4D985BB69AB06F561A8A1FC0267D6B739A8FCB0408C136032C98E999CBEDE2171A573D6372DCFD8C4768EB28C8072C15F93BB5; path=/; HttpOnly
Set-Cookie:.ASPXAUTH=AC0D8B61C22BBBB6D5ECC984350B184A2A56C93B59107CAEE771322332F36565625F4131E70D3B79D2E85950C877DD281B2FE2F93720AC6BEF76C2C813189EC3716130B5FF183264EFEC13D3C9D6CFBE32B3B3186FDE99C6FF2C61C1D06EAF1D20ED5D6C0B203E3EFA1F10F469305BFE70963A009067170D19AB9A174868DFA221F55A8F0513C360A8A9DB3C75EF492888DB35B6BA7B7774111CAE4AC563DEF1B7773E9449B062CBECC487D6C0223D7B24DBD4060E77157DBEFD66E7B98005D79F4D985BB69AB06F561A8A1FC0267D6B739A8FCB0408C136032C98E999CBEDE2171A573D6372DCFD8C4768EB28C8072C15F93BB5; path=/; HttpOnly

Set-Cookie:BPMSESSIONID=qripp0ch5jp3uvfzokswqxms; expires=Mon, 30-Sep-2013 06:30:25 GMT; path=/0

Обратил внимание, что в последней строке Set-Cookie на 1 год меньше текущей даты (30-Sep-2013)
Произошло это после перезапуска сайта на сервере iis и очистки кэша.

В чем может быть проблема?

У меня такой же вопрос

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

Добрый день, Александр!

Ошибка может возникать если указано некорректное время на сервере приложений. Также, необходимо перезапустить Application Pool сайта на IIS сервере.

На сервере время корректное. Пул перезапускал - не помогло.

В телефонном разговоре, Вы подтвердили неактуальность данного вопроса.

Нашел источник проблемы.
При перезапуске пула приложения в значение кэшируемой системной настройки попало значение null.
При авторизации система пыталась его преобразовать в Guid.

Необходимый параметр найден следующим запросом (из результата смотрим, какой из них пустой)

SELECT SV.SysAdminUnitId, S.Name, SV.Id
  FROM [dbo].[SysSettings] as S
  JOIN dbo.SysSettingsValue as SV on SV.SysSettingsId =  S.Id
  WHERE
  ValueTypeName = 'Lookup' and 
   S.IsCacheable = 1

Исправлено

  update dbo.SysSettingsValue
  set SysAdminUnitId = 'A29A3BA5-4B0D-DE11-9A51-005056C00008' --все пользователи
  where id = '2347BD06-7C30-4A3F-819E-60539FB1B42E' -- id строки, которую нужно править

Спасибо за оперативный звонок.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Изменила связанный контакт пользователя. Лицензия конкурентная. При входе в ТС возникает ошибка: "Ошибка открытия конфигурации. 'Лицензия для модуля 'Common' не найдена", при каждой новой попытке авторизоваться возникает эта ошибка, но название модуля постоянно меняется.

У меня такой же вопрос

1 комментарий

Олеся, для устранения ошибки необходимо перезаказть лицензии.
Внесение изменений в контакт пользователя системы требует перезаказ лицензий.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте!
после установки BPMOnline 5.4 demo при авторизации под пользователем "Пользователь 1" получаю следующую ошибку

Ошибка авторизации
Вы ввели неправильный логин или пароль, либо Ваша учетная запись неактивна

возможно, что-то упустил при настройке IIS? (IIS 6.1)

У меня такой же вопрос

4 комментария

Здравствуйте Ростислав!
Попробуйте при авторизации использовать логин Supervisor.

Здравствуйте, Дмитрий! пробовал этот вариант - не помогает. такое ощущение, что проблемы или с подключением к базе или с самой базой. может быть на это влияют какие-нибудь настройки redis или iis ?

Хорошо, тогда попробуйте добавить в SQL администратора Supervisor (sysadmin - параметр и SQL-й логин), после этого не забудьте заменить в ConnectionStrings.config - Integrated Security = SSPI на User ID = Supervisor.

Если не получится сообщите мне свой контакт для связи.

Здравствуйте, Дмитрий! после звонка в техподдержку выяснилось, что файлы установки имели версию, для которой не может существовать демо-базы. все решилось скачиванием другой релизной версии bpmonline 5.4 с демо-базой

Войдите или зарегистрируйтесь, чтобы комментировать