Как пройти аутентификацию в Workday API в ядре .net? - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь подключиться к API рабочего дня (SOAP) из функций Azure в .NET Core, но у меня возникают некоторые проблемы с аутентификацией.

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

SecurityBindingElement sb = SecurityBindingElement.CreateUserNameOverTransportBindingElement();

sb.IncludeTimestamp = false;

const int lim = Int32.MaxValue;
var timeout = TimeSpan.FromMinutes(2);

var cb = new CustomBinding(
    sb,
    new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8)
    {
        ReaderQuotas = new XmlDictionaryReaderQuotas
        {
            MaxDepth = lim,
            MaxStringContentLength = lim,
            MaxArrayLength = lim,
            MaxBytesPerRead = lim,
            MaxNameTableCharCount = lim
        }
    },
    new HttpsTransportBindingElement
    {
        MaxReceivedMessageSize = lim,
        MaxBufferSize = lim,

    })
{
    SendTimeout = timeout,
    ReceiveTimeout = timeout
};

var client = new WorkDayAbsenceServiceReference.Absence_ManagementPortClient(cb, new EndpointAddress("https://wd3-impl-services1.workday.com/ccx/service/mytenant/Absence_Management/v33.0"));
client.ClientCredentials.UserName.UserName = "myusername";
client.ClientCredentials.UserName.Password = "mypassword";

var headers = new WorkDayAbsenceServiceReference.Workday_Common_HeaderType() {};

var requestType = new WorkDayAbsenceServiceReference.Get_Time_Off_Plan_Balances_RequestType()
{
    Request_Criteria = new WorkDayAbsenceServiceReference.Time_Off_Plan_Balance_Request_CriteriaType()
    {
        Employee_Reference = new WorkDayAbsenceServiceReference.WorkerObjectType()
        {
            ID = new WorkDayAbsenceServiceReference.WorkerObjectIDType[]
            {
                new WorkDayAbsenceServiceReference.WorkerObjectIDType
                {
                    type = "Employee_ID",
                    Value = "_0000028"
                }
            }
        }
    }
};


var test = await client.Get_Time_Off_Plan_BalancesAsync(headers, requestType);

И код ошибки, который я получаю:

System.Private.CoreLib: Исключительная ситуация при выполнении функции: GetDaysOff. System.Private.ServiceModel: TransportSecurityBindingElement.BuildChannelFactoryCore не поддерживается.

1 Ответ

0 голосов
/ 11 ноября 2019

Функция сообщений в безопасности еще не поддерживается в asp.net core-2.0.

Вы можете проверить полный список поддерживаемых функций здесь: https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.0.0.md

В качестве альтернативы вы можете попробоватьсоздайте свой собственный SOAP-конверт в виде веб-API-интерфейса на основе .Net Standard, который обеспечит безопасность, и вы можете просто вызвать его из функции Azure с помощью httpclient. Я не пробовал, но я получил эту идею из поста ниже:

Как мне вызвать службу XML SOAP, для которой требуется подпись от .Net Core?

private static HttpClient Client = new HttpClient(); 

Uri uri = new Uri("https://thirdparty.com/service.svc");
X509Certificate2 cert = // from some store etc
var envelope = BuildEnvelope(cert);

using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uri))
{
    request.Content = new StringContent(envelope, Encoding.UTF8, "application/soap+xml");
    using (HttpResponseMessage response = Client.SendAsync(request).Result)
    {
        if (response.IsSuccessStatusCode)
        {
            response.Content.ReadAsStringAsync().ContinueWith(task =>
            {
                string thirdparty_envelope = task.Result;
                XElement thirdparty_root = XElement.Parse(thirdparty_envelope);
                // etc
            }, TaskContinuationOptions.ExecuteSynchronously);
        }
    }
}

Дополнительная справка:

https://github.com/dotnet/wcf/issues/13

https://github.com/dotnet/wcf/issues/8

В качестве альтернативы, вы можете использовать приложение Microsoft Logic с соединителем рабочего дня, а затем использовать конечную точку. Хотя он находится в режиме предварительного просмотра, но вы также можете реализовать свой собственный соединитель.

https://docs.microsoft.com/en-us/connectors/custom-connectors/create-register-logic-apps-soap-connector

Надеюсь, это поможет, не стесняйтесь отмечать меня в своем разговоре.

...