Подтвердить что ты не робот

Ошибка при выпуске внутренней ошибки сервера GoogleOauth2

Я решил дать новое промежуточное ПО Google Oauth2 попробовать, и он в значительной степени сломал все. Вот моя конфигурация поставщика от startup.auth.cs. Когда включено, все поставщики, включая провайдера google, получают 500 внутренних серверов на Challenge. Однако детали внутренней ошибки сервера недоступны, и я не могу понять, как включить любую отладку или трассировку для промежуточного программного обеспечения Katana. Мне кажется, что они были в спешке, чтобы получить промежуточное ПО Google Oauth из двери.

  //// GOOGLE
        var googleOptions = new GoogleOAuth2AuthenticationOptions
        {
            ClientId = "228",
            ClientSecret = "k",
            CallbackPath = new PathString("/users/epsignin")
            SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
            Provider = new GoogleOAuth2AuthenticationProvider
            {
                OnAuthenticated = context =>
                {
                    foreach (var x in context.User)
                    {
                        string claimType = string.Format("urn:google:{0}", x.Key);
                        string claimValue = x.Value.ToString();
                        if (!context.Identity.HasClaim(claimType, claimValue))
                            context.Identity.AddClaim(new Claim(claimType, claimValue, XmlSchemaString, "Google"));
                    }
                    return Task.FromResult(0);
                }
            }
        };

        app.UseGoogleAuthentication(googleOptions);

Код ActionMethod:

 [AllowAnonymous]
    public ActionResult ExternalProviderSignIn(string provider, string returnUrl)
    {
       var ctx = Request.GetOwinContext();
        ctx.Authentication.Challenge(
            new AuthenticationProperties
            {
                RedirectUri = Url.Action("EPSignIn", new { provider })
            },
            provider);
        return new HttpUnauthorizedResult();
    }
4b9b3361

Ответ 1

Мне потребовалось много часов, но проблема в том, что это CallbackPath, как упоминалось в @CrazyCoder. Я понял, что CallbackPath в public void ConfigureAuth(IAppBuilder app) ДОЛЖЕН отличаться от того, когда он установлен в ChallengeResult. Если они одинаковы, в OWIN выбрано 500 ошибок.

Мой код для ConfigureAuth(IAppBuilder app) есть

var googleOptions = new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationOptions
{
    ClientId = "xxx",
    ClientSecret = "yyy",
    CallbackPath = new PathString("/callbacks/google"), //this is never called by MVC, but needs to be registered at your oAuth provider

    Provider = new GoogleOAuth2AuthenticationProvider
    {
        OnAuthenticated = (context) =>
        {
            context.Identity.AddClaim(new Claim("picture", context.User.GetValue("picture").ToString()));
            context.Identity.AddClaim(new Claim("profile", context.User.GetValue("profile").ToString()));
            return Task.FromResult(0);
        }      
    }
};

googleOptions.Scope.Add("email");

app.UseGoogleAuthentication(googleOptions);

Код моего "обратного вызова":

// GET: /callbacks/googlereturn - callback Action
[AllowAnonymous]
public async Task<ActionResult> googlereturn()
{
        return View();
}

//POST: /Account/GooglePlus
public ActionResult GooglePlus()
{
    return new ChallengeResult("Google", Request.Url.GetLeftPart(UriPartial.Authority) + "/callbacks/googlereturn", null);  
    //Needs to be a path to an Action that will handle the oAuth Provider callback
}

private class ChallengeResult : HttpUnauthorizedResult
{
    public ChallengeResult(string provider, string redirectUri)
        : this(provider, redirectUri, null)
    {
    }

    public ChallengeResult(string provider, string redirectUri, string userId)
    {
        LoginProvider = provider;
        RedirectUri = redirectUri;
        UserId = userId;
    }

    public string LoginProvider { get; set; }
    public string RedirectUri { get; set; }
    public string UserId { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var properties = new AuthenticationProperties() { RedirectUri = RedirectUri };
        if (UserId != null)
        {
            properties.Dictionary[XsrfKey] = UserId;
        }
        context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
    }
}
  • callbacks/google, похоже, обрабатывается OWIN
  • callbacks/googlereturn, по-видимому, обрабатывается MVC

Теперь все работает, хотя хотелось бы точно узнать, что происходит "под капотом"

Мой совет, если у вас нет другого требования, заключается в том, чтобы позволить OWIN использовать пути перенаправления по умолчанию и убедиться, что вы сами не используете их.

Ответ 2

Нет необходимости указывать CallbackPath в UseGoogleAuthentication:

CallbackPath = new PathString("/Account/ExternalLoginCallback")

Просто сохраните параметр Google для Авторизованного перенаправления URIs как:

HTTP (s)://yoururl: ORPort/ Google-зарегистрировались

Owin обрабатывает signin-google внутри себя и перенаправляет на redirectUri, как указано в вашем коде для класса ChallengeResult. Что такое Account/ExternalLoginCallback.

Ответ 3

Получил работу ваниль из учебника с ОДНОЙ простой заменой - просто разместив это для любых нубов для этого подхода. Я думаю, что проблемы, связанные с oauth2 в этом случае, в значительной степени связаны с последними шаблонами /apis - я имею в виду, если вы начинаете с нуля, вам может быть повезло - читайте дальше:

Я просто сделал этот урок https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-deploy-aspnet-mvc-app-membership-oauth-sql-database/

и ссылается на это также http://blogs.msdn.com/b/webdev/archive/2014/07/02/changes-to-google-oauth-2-0-and-updates-in-google-middleware-for-3-0-0-rc-release.aspx

Одно изменение: он работал, но ТОЛЬКО после включения google + apis в новейшей версии сайта разработчика Google.

(Просто зайдите в google api lib manager, войдите в систему и выполните поиск в каталоге apis для google + api).
Примечание: для меня api Google+ по умолчанию отключен.

Я не сделал ничего уникального.

Приветствия

Ответ 4

Ответы, приведенные до сих пор, привели меня к действительно темному пути, который я бы хотел, чтобы я не путешествовал... простое решение: убедитесь, что следующие 3 вещи соответствуют:

1) В учетных данных Google OATH (https://console.developers.google.com/):

2) В AccountController:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
    return new ChallengeResult(provider, 
        Url.Action("ExternalLoginCallback", "Account", 
        new { ReturnUrl = returnUrl }));
}

Обратите внимание, что действие "ExternalLoginCallback"

3) В App_Start\Startup.Auth.cs

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "yourclientid.apps.googleusercontent.com",
    ClientSecret = "yoursecret",
    Provider = new GoogleOAuth2AuthenticationProvider(),
    CallbackPath = new PathString("/Account/ExternalLoginCallback")
});

Обратите внимание, что CallbackPath снова имеет тот же PathString, что и другие 2

Наконец, если вы все еще не получаете его, установите для режима проверки подлинности значение None в приложении Web.config

<authentication mode="None" />

чтобы получить более подробную информацию о проблеме.

Ответ 5

Я использую шаблон ASP.NET MVC по умолчанию по умолчанию с идентификационной аутентификацией для простоты, но, надеюсь, это может быть изменено для разных случаев использования.

StartupAuth.cs

Не настраивайте путь перенаправления. Он все равно заменяется /signin -google, и мои попытки обойти это вызвали "немой" (не в отладчике) ошибки Internal Server 500.

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "whatevs.apps.googleusercontent.com",
    ClientSecret = "whatevs_secrut",
    Provider = new GoogleOAuth2AuthenticationProvider()
});

Обязательно добавьте http://whatever.com/signin-google в https://console.developers.google.com/ в разделе APIs & auth > Credentials > Redirect URIs.

RouteConfig.cs

Добавьте маршрут к постоянному действию контроллера перенаправления на ваши маршруты. Перманентные переадресации - единственное, что будет достаточно здесь. Недостаточно просто напрямую обращаться к URL-адресу обратного вызова.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Google API Sign-in",
        url: "signin-google",
        defaults: new { controller = "Account", action = "ExternalLoginCallbackRedirect" }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

AccountController.cs

Постоянное перенаправление на встроенный метод обратного вызова, и вы должны быть в порядке.

[AllowAnonymous]
public ActionResult ExternalLoginCallbackRedirect(string returnUrl)
{
    return RedirectPermanent("/Account/ExternalLoginCallback");
}

Проект шаблона размещен на GitHub для справки: https://github.com/Pritchard/Test-AspNetGoogleOAuth2Authentication