Добавьте аутентификацию SSL на сервере REST, написанном в Visual C ++ - PullRequest
0 голосов
/ 13 мая 2019

Я на самом деле кодирую REST-сервер, используя Visual C ++. Это мой сервер:

Файл IRestServer.h:

using namespace System;
using namespace System::ServiceModel;
using namespace System::ServiceModel::Web;

[ServiceContract(Name = "MyRESTServer")]
public interface class IRestServer
{
    [OperationContract]
    [WebGet(UriTemplate = "/ping", ResponseFormat = WebMessageFormat::Json, BodyStyle = WebMessageBodyStyle::Bare)]
    virtual bool Ping() = 0;
};

файл main.h:

[ServiceBehavior(InstanceContextMode = InstanceContextMode::Single, ConcurrencyMode = ConcurrencyMode::Single, IncludeExceptionDetailInFaults = true)]
public ref class TRestServerEx : public System::Windows::Forms::Form, public IRestServer
{
public:
    TRestServerEx(void)
    {
        [...]
        this->OpenRestServer();
    }
    ~TRestServerEx()
    {
        [...]
    }
public:
    bool AddCors()
    {
        WebOperationContext::Current->OutgoingResponse->Headers->Add("Access-Control-Allow-Origin", "*");

        if (WebOperationContext::Current->IncomingRequest->Method == "OPTIONS")
        {
            WebOperationContext::Current->OutgoingResponse->Headers->Add("Access-Control-Allow-Methods", "POST, OPTIONS, GET");
            WebOperationContext::Current->OutgoingResponse->Headers->Add("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization, x-requested-with");
            return false;
        }
        return true;
    }
    virtual bool Ping() override
    {
        if (this->AddCors() == false)
        return nullptr;
    return true;
    }
    void OpenRestServer()
    {
        String^ err;
        try
        {
            this->_serviceHost = gcnew WebServiceHost(this, gcnew Uri("http://localhost:4242/ServerEx"));
            this->_serviceHost->Open();
        }
        catch (Exception^ e)
        {
            err = e->ToString();
        }
    }
private:
    WebServiceHost^ _serviceHost;
};
main.cpp file :

[STAThreadAttribute]
void Main(array<String^>^ args)
{
    TRestServerEx^ frm = gcnew TRestServerEx();
    Application::Run(frm);
}

Сервер работает нормально.

Я сейчас пытаюсь получить доступ к серверу REST с защищенного веб-сервера (с помощью запросов ajax), но получаю ошибку SSL: net::ERR_SSL_PROTOCOL_ERROR

Так что мне нужен мой REST-сервер для включения аутентификации SSL.

Что я пробовал: Я пробовал много кода, но это не легко адаптировать ASP.net в Visual C ++.

Я пытался добавить https в свой базовый адрес: this->_serviceHost = gcnew WebServiceHost(this, gcnew Uri("https://localhost:4242/ServerEx"));

Но я получаю ошибку выполнения при открытии службы: «Невозможно найти базовый адрес, соответствующий схеме https [...]» *

Я нашел этот кусок кода:

WebHttpBinding^ secureWebHttpBinding = gcnew WebHttpBinding(WebHttpSecurityMode::Transport);

secureWebHttpBinding->Name = "secureHttpWeb";
this->_serviceHost->AddServiceEndpoint("IRestServer", secureWebHttpBinding, ""));

Но когда я его добавляю, сервер не отвечает ни на какие запросы.

У меня есть сомнения по поводу первого и последнего параметра в методе AddServiceEndpoint. «IrestServer» является строковым представлением моего сервисного контракта, но это хороший способ передать его в параметре? Я пробовал с decltype, но он не компилируется: this->_serviceHost->AddServiceEndpoint(decltype(IRestServer), secureWebHttpBinding, ""));

Я уверен, что не так далеко от правильного способа написания декларации сервера, но я что-то упустил.

Заранее спасибо за помощь,

Батист

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...