ASP.NET Owin OAuth(Google / Facebook)重定向到默认的login.aspx页面,而不是远程登录页面。

10 浏览
0 Comments

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

0
0 Comments

  <system.webServer>
    <modules>
      <remove name="FormsAuthentication" />
    </modules>
  </system.webServer>

0
0 Comments

问题的原因是在使用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的项目中遇到此问题,那么这只是一个解决方案,用于解决配置或使用的软件包中的某些问题。是否有人可以提供更多的见解?我对解决方案不太满意。

0