502 Неверный ответ при вызове Google Api с веб-сайта Azure

Когда я вызываю API Google с веб-сайта Azure, я получаю 502 - веб-сервер получил неверный ответ, выступая в качестве шлюза или прокси-сервера. Точный код работает как с моей локальной машины, так и с виртуальной машины Azure.

Код просто чтобы получить отображаемое имя из идентификатора пользователя Google

private string GetUserDetails(string userId)
{
    var serviceAccountEmail = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com";
    var certFile = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/googlekey.p12");
    var certificate = new X509Certificate2(certFile, "notasecret", X509KeyStorageFlags.Exportable);

    var credential = new ServiceAccountCredential(
       new ServiceAccountCredential.Initializer(serviceAccountEmail)
       {
           Scopes = new[] { PlusService.Scope.PlusMe }
       }.FromCertificate(certificate));

    var service = new PlusService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = "Bayfront"
    });

    var request = service.People.Get(userId);
    var person = request.Execute();
    return person.DisplayName;
}

Это было вызвано в проекте WebApi, но я извлек его в одностраничную веб-форму asp.net по адресу http://testgplus.azurewebsites.net/

Я также попробовал простой REST-клиент с ApiKey вместо того, чтобы использовать выше. Опять же, это работает на ВМ, но не на веб-сайте, где я получаю 403 Запрещено. Я добавил IP-адреса веб-сайта и виртуальной машины в консоль разработчиков Google.

private string GetUserDetails2(string userId)
{
    var client = new RestClient("https://www.googleapis.com/plus/v1/people/" + userId);
    var request = new RestRequest(Method.GET);
    request.AddParameter("key", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    var response = client.Execute(request);
    if (response.StatusCode == HttpStatusCode.OK)
    {
        dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(response.Content);

        return result["name"]["givenName"];
    }
    return response.StatusCode.ToString();
}

Похоже, я не могу вызвать внешний веб-сервис для веб-сайта Azure. Я видел некоторые похожие проблемы, например, 502, запрашивающий платежный сервис на лазурном "веб-сайте", но ни одно из предложений не сработало. У кого-нибудь есть идеи о том, что может быть причиной или решением проблемы?

2 ответа

Я видел ваш вопрос раньше, но не заметил решения... У меня есть и сейчас. При создании сертификата добавьте:

var certificate = new X509Certificate2(p12Path, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
//(notice the X509KeyStorageFlags.MachineKeySet |)

, Привет, Колин Меровски

Где вы создаете сертификат, в Application_Start или в методе WebApiConfig Register?

где использовать этот код?

makecert -r -n "CN=abdullahsargin.com, E=sargin48@gmail.com" -sky exchange -b 11/01/2015 -pe -sv myhost.pvk myhost.cer

pvk2pfx -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po Test.123

В global.asax application_start

         try
        {
            var certFile = Server.MapPath("~/App_Data/myhost.pfx");
            var cert = new X509Certificate2(certFile, "Test.123",
                X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
        }
        catch (Exception exc)
        {
            _tools.LogError(exc);
        }

, этот метод успешно работает на локальном компьютере, но в Azure получите 502 этого кода, я тестирую этот метод строка и строка

  var code = await _userManager.GeneratePasswordResetTokenAsync(user.Id);

завершить этот метод

    [HttpGet, AllowAnonymous]
    public async Task<HttpResponseMessage> ForgotPassword([FromUri] ForgotPasswordViewModel model)
    {
        try
        {               
            var code = await _userManager.GeneratePasswordResetTokenAsync(user.Id);

            return Request.CreateResponse(HttpStatusCode.OK, new { model = user });

            var url = "http://abdullahsargin.com#/account/resetPassword/" + user.Id + "/" + code;

            await _userManager.SendEmailAsync(user.Id, "Reset Password",
            "Please reset your password by clicking here: <a href=\"" + url + "\">link</a>");

            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (Exception exc)
        {
            MyTools.LogError(exc.GetBaseException());
            return Request.CreateResponse(HttpStatusCode.BadRequest, exc.GetBaseException());
        }
    }

я нахожу на этой странице свое решение

Удостоверение ASP.NET: используйте GeneratePasswordResetToken на веб-сайте Azure

для моего решения

public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))
{
    // other setup
    this.UserTokenProvider = new TotpSecurityStampBasedTokenProvider<ApplicationUser, string>();
}
Другие вопросы по тегам