[英]ASP.NET Owin OAuth (Google / Facebook) is redirecting to default login.aspx insead of remote log in page
我正在使用 Owin 库(包括 Google 和 Facebook)设置 OAuth。
从外观上看,Owin 启动类注册得很好。 我发现不是被重定向到 Facebook 或 Google 的适当登录页面,而是被重定向到默认的“login.aspx”页面。 我的解决方案中没有 login.aspx 页面。
流在视图中触发,如下所示:
@{
// Get list of configured external authentication middleware
var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();
if (!loginProviders.Any())
{
<div>
<p>There are no external authentication services configured</p>
</div>
}
else
{
using (Html.BeginForm("ExternalLogin", "OAuth"))
{
@Html.AntiForgeryToken()
<div>
<p>
@foreach (AuthenticationDescription p in loginProviders)
{
<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>
}
</p>
</div>
}
}
}
这会触发质询结果,但是质询结果只会导致重定向到 login.aspx(同样不存在)
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider)
{
string redirectUri = Url.Action("ExternalLoginCallback");
// Request a redirect to the external login provider
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" }, // "email", also "publish_actions" can be included if post to facebook authorization is required
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
);
}
关键的修改是添加代码:
// Stop execution of the current page/method - the 401 forces OWIN to kick-in and do its thing
Response.StatusCode = 401;
Response.End();
AuthenticationProperties.RedirectUri 不会在 Challenge() 中传递给 Google
其他问题是未启用 Google+ API
OWIN 的 GetExternalLoginInfoAsync 总是返回 null
...对于 Facebook,需要将 Owin 库升级到 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();
}
此问题的根本原因(重定向到 login.aspx)是在迁移到 OWIN 身份验证的过程中,FormsAuthentication 实际上并未完全关闭,因此这是两者之间冲突的结果。
要完全停用表单身份验证模块并解决此问题,您可以将以下内容添加到 web.config 文件的模块部分:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.