Вопрос

Добрый день.

Есть такой случай: есть сервис где для авторизации нужно постом отправить данные clientID, secretID и grant_type, а в ответ приходит токен, тип токена и скрок действия токена. Для вызова других методов этого api нужно в header передавать Authorization : "тип токена" "токен". 

Допустим, для использования этого аpi, создаем процесс который по времени будет обновлять токен и сохранять его например в системную переменную(настройку). Но как с помощью веб-сервисов сделать запрос  и вставить в него header с "Authorization" ?

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

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

Сергей приветствую

Способ авторизации у вас отличен от OAuth2? Каким способов Авторизации вы пользуетесь при работе с Веб-сервисом? немного этого не допонял. Спаисбо.

Власов Михаил Викторович,

Добрый день Михаил вот документации  https://sendpulse.ua/integrations/api#url но увы я не вижу  там описания какой версии OAuth2

Немного покопавшись в интернете и сопоставив с  документацие - сделал вывод, что там описан метод авторизации "Bearer token". А из коробки bpmonline готовой реализации такой авторизации нету.

Если речь об обращению к стороннему сервису в C#-коде, то в стандартных примерах  есть добавление в заголовки токена BPMCSRF:

// Добавление CSRF токена в заголовок запроса.
CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
string csrfToken = cookieCollection["BPMCSRF"].Value;
updateRequest.Headers.Add("BPMCSRF", csrfToken);

А в готовом элементе БП по вызову веб-сервиса есть только базовая аутентификация  и OAuth 2.0.

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

При входе в BPM появляется ошибка авторизации, подскажите, как это можно исправить.

Версия BPMonline 7.2 (почему-то нельзя выбрать на форуме при создании вопроса)

Чистка SysUserSession и перезапуск IIS не помогают.

Скрин прилагается.

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

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

Добрый день, Юрий.

Нужно смотреть профиль пользователя Supervisor. Скорее всего у него был удален контакт, также стоит проверить активен ли он, в каких группах состоит и какие лицензии ему розданы. Это может сделать другой системный администратор. Если же Supervisor был единственным сисадмином - тогда это нужно проверить напрямую в БД.

Контакт присутствует. Роли и лицензии прикладываю.

Иногда бывает, что проблема сама проходит, но на данный момент ошибка всё еще воспроизводится.

 

 

 

 

 

2018-06-06 17:47:34,916 [11752] INFO OperationLogger LogUserLoginError - Отказ авторизации пользователя Supervisor. IP-адрес: ::1. Причина отказа: LicHelper не проинициализирован

2018-06-06 17:58:19,398 [6408] ERROR ..\tz-user-1 Terrasoft.WebApp.Loader.FileWebEventProvider RaiseInternal - Date: 06.06.2018 17:58:19
Date (UTC): 06.06.2018 13:58:19

Exception Message: Профиль пользователя является временным профилем.

Exception Type: System.Security.Cryptography.CryptographicException
Exception Source: mscorlib

Exception Stack Trace:
   в System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   в System.Security.Cryptography.Utils.get_StaticDssProvHandle()
   в System.Security.Cryptography.DSACryptoServiceProvider.ImportParameters(DSAParameters parameters)
   в System.Security.Cryptography.DSA.FromXmlString(String xmlString)
   в Terrasoft.Common.DSACryptoServiceProvider.VerifyData(String data, String signedData, String publicKey)
   в Terrasoft.Core.LicHelper.CheckLicKey(String packageName, Int32 licCount, DateTime startDate, DateTime dueDate, String licKey, String publicKey, Int32 licType, Int32 sspSchemaCount, Int32 sspAdministratedSchemaCount)
   в Terrasoft.Core.LicHelper.GetUserValidPackages(Guid userId, Boolean throwLicExceptions)
   в Terrasoft.Core.LicHelper.InitializeSysPackages()
   в Terrasoft.Core.UserConnection.get_LicHelper()

SessionID: i3z1jgifmbms21gocshfzshy
Request URL: /Lic/LicManager.aspx
Request Path: /Lic/LicManager.aspx
Request Type: GET
User Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
User Host Address: ::1
User: Supervisor
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False
 

удалось победить, создав постоянный профиль для пользователя

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

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

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

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

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

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

Собственно вопрос - как разрешить удаленный вызов процедур 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 комментарий

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

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