ASP.NET Owin OAuth(Google / Facebook)重定向到默认的login.aspx页面,而不是远程登录页面。
ASP.NET Owin OAuth(Google / Facebook)重定向到默认的login.aspx页面,而不是远程登录页面。
我正在使用Owin库来设置OAuth,包括Google和Facebook。
看起来Owin启动类注册成功了。但我发现,我被重定向到一个默认的'login.aspx'页面,而不是被重定向到Facebook或Google的适当的登录页面。我的解决方案中没有login.aspx页面。
流程是在视图中触发的,代码如下:
@{ // 获取已配置的外部身份验证中间件列表 var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes(); if (!loginProviders.Any()) { There are no external authentication services configured } else { using (Html.BeginForm("ExternalLogin", "OAuth")) { @Html.AntiForgeryToken() @foreach (AuthenticationDescription p in loginProviders) { } } } }
这将触发挑战结果,然而挑战结果只是导致重定向到login.aspx(再次强调,该页面不存在)。
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult ExternalLogin(string provider) { string redirectUri = Url.Action("ExternalLoginCallback"); // 请求重定向到外部登录提供程序 return new ChallengeResult(provider, redirectUri); }
我可能漏掉了什么?
为了保险起见,我还包含了Startup.cs类:
public void Configuration(IAppBuilder app) { app.UseCookieAuthentication( new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie }); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); app.UseFacebookAuthentication(new FacebookAuthenticationOptions { AppId = Config.OAuthFacebookAppId, AppSecret = Config.OAuthFacebookAppSecret, Scope = { "email" }, // 如果需要发布到Facebook授权,则还可以包括"email"和"publish_actions" Provider = new FacebookAuthenticationProvider { OnAuthenticated = context => { context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); return Task.FromResult(true); } } }); app.UseGoogleAuthentication( clientId: Config.OAuthGoogleClientId, clientSecret: Config.OAuthGoogleClientSecret ); }
问题的原因是在使用ASP.NET Owin OAuth (Google / Facebook)身份验证时,重定向到默认的login.aspx页面而不是远程登录页面。解决方法是添加以下代码:
// Stop execution of the current page/method - the 401 forces OWIN to kick-in and do its thing Response.StatusCode = 401; Response.End();
此外,还需要确保Google+ API已启用,并且对于Facebook登录,需要升级Owin libs到3.1.0版本。下面是完整的ExternalLogin方法:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public void ExternalLogin(string provider) { string redirectUri = Url.Action("ExternalLoginCallback"); var properties = new AuthenticationProperties() { RedirectUri = redirectUri }; HttpContext.GetOwinContext().Authentication.Challenge(properties, provider); // Stop execution of the current page/method - the 401 forces OWIN to kick-in and do its thing Response.StatusCode = 401; Response.End(); }
如果在新的MVC 5项目中没有添加响应重定向,一切都能正常工作。但是,如果在从MVC 4升级到MVC 5并将FormsAuthentication更改为OWIN的项目中遇到此问题,那么这只是一个解决方案,用于解决配置或使用的软件包中的某些问题。是否有人可以提供更多的见解?我对解决方案不太满意。