Pergunta

Tem uma coisa estranha acontecendo aqui.

Eu construí um ASP.NET MVC5 site, e têm contas locais de trabalho bem via ASP.NET Identidade.

Agora estou tentando habilitar a autenticação externa, mas tem alguma estranheza acontecendo.

Estou certo de que eu tenha seguido os passos certos.Tenho isso em minha Startup.Auth.cs:

    public void ConfigureAuth(IAppBuilder app)
    {
        // Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //   consumerKey: "",
        //   consumerSecret: "");

        //app.UseFacebookAuthentication(
        //   appId: "",
        //   appSecret: "");

        app.UseGoogleAuthentication();
    }

Quando o usuário clica no link para iniciar sessão com o Google, o ExternalLogin método é chamado de:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
    }

O que eu tenho verificado através de depuração fica na ExecuteResult método de ChallengeResult classe:

        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);
        }

No entanto, no navegador, não acontece nada.Acabei de receber uma página em branco onde eu poderia esperar de um redirecionamento para o Google signin página.

Não existem erros relatados em tudo.

Outra coisa engraçada é que eu tentei criar outra MVC5 aplicativo, mas eu tenho uma "referência de Objeto não definida para uma instância de um objeto" pop-up no VS2013, e o projeto resultante está faltando o controlador da Conta que é geralmente existe por padrão.

Eu tenho reparado que a instalação de VS2013, eu re-instalado o Update 1, e eu também atualizei todos os pacotes Nuget na solução.

Eu tenho que correr sem idéias de onde ir.

Atualização 1 Pensar que isso pode ser relacionado para o meu PC, eu já implantou o site do Azure, e o problema ainda persiste.Será que isso significa que pode estar relacionado à falta de um conjunto, e não está sendo relatado corretamente?Eu tenho que correr fusionlog, mas eu não vejo nenhuma ligação falhas.

Girando uma nova VM com uma instalação limpa do Windows 8 e VS2013 para ver se eu posso obter um novo projeto de trabalho lá.

Atualização 2 Ok, acabou de fazer mais uma rodada de "network" (rede de captura, e quando o usuário seleciona o fornecedor externo, ele FAZ o post para o ExternalLogin ação, mas a resposta é um 401 não autorizado.O que poderia estar causando isso?

Foi útil?

Solução

Ok,

Eu descobri o que (o mais importante) de que o problema foi.

Em primeiro lugar, eu ainda não se sabe porque quando eu criar um projeto MVC não recebo um andaime ed AccountController classe.

No entanto, parece que o meu problema é que meu botão de início de sessão estava passando "google" em vez de "Google" como o provedor.

Sério!?Eu estou um pouco surpreso que o revestimento seria importa com o nome do provedor, mas lá vai.

Outras dicas

Esta não é a resposta para a sua pergunta, mas respondeu muito semelhante problema

Se você tivesse Owin 2.0 e migrar para o 2.1

O _ExternalLoginsListPartial necessidade de se alterar a partir deste:

<button type="submit" class="btn btn-default" id="@p.AuthenticationType" name="Partner" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.AuthenticationType</button>

para esta

<button type="submit" class="btn btn-default" id="@p.AuthenticationType" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.AuthenticationType</button>

A única coisa de que a mudança é o nome do botão, mas que poderia quebrar a sua cabeça como a minha, e me custou 2 dias de trabalho para encontrar o problema.

Talvez isso é explicado no novo Owin versão, se não deve ser algo para especificar nas capitais.

Eu corri para o mesmo problema com o meu ASP.Net WebAPI servidor.Eu estava passando o correto AuthenticationType para o desafio método, mas ainda está recebendo uma página em branco.

Acontece que o problema era a ordem que eu adicionei o OAuth fornecedores para o OWIN pipeline durante a inicialização.Cerca de minha ordem de trabalho:

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        OAuthBearerOptions = new OAuthBearerAuthenticationOptions();

        var authServerOptions = new OAuthAuthorizationServerOptions
        {
        ...
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(authServerOptions);
        app.UseOAuthBearerAuthentication(OAuthBearerOptions);

        // Configure Google External Login
        GoogleAuthOptions = new GoogleOAuth2AuthenticationOptions()
        {
            ClientId = xxxx,
            ClientSecret = xxxx,
            Provider = new GoogleAuthProvider()
        };
        app.UseGoogleAuthentication(GoogleAuthOptions);

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);

Anteriormente, eu estava adicionando o UseCors + UseWebApi métodos antes de UseGoogleAuthentication método.

Eu encontrei este post para ser útil também:http://coding.abel.nu/2014/06/understanding-the-owin-external-authentication-pipeline/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top