Autenticação externa não redirecionando para sites externos
-
21-12-2019 - |
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?
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/