Facebook文档给出了这个javascript代码
FB.login(
function(response) {
console.log(response);
},
{
scope: 'email',
auth_type: 'rerequest'
});
有可能在我的StartUp.cs中实现上述功能吗?
app.UseFacebookAuthentication(new FacebookOptions
{
AuthenticationScheme = "Facebook",
DisplayName = "Facebook",
SignInScheme =
IdentityServerConstants.ExternalCookieAuthenticationScheme,
AppId = "***",
AppSecret = "***",
Events = new OAuthEvents
{
OnRemoteFailure = context =>
{
context.HandleResponse();
context.Response.Redirect("/Account/Login");
return Task.FromResult(0);
}
}
});
有点晚了,但我也有同样的问题,也许我的解决方案将来会帮助其他人。
首先:要在facebook上强制设置同意页面,您需要将auth_type=rerequest
添加到查询中(处理已撤销的权限)。
第二:一个被吊销的权限不会引发错误。它将按照正常方式进行,但没有要求的范围/索赔。因此,在这种情况下不会调用OnRemoteFailure
。只有当用户完全取消了同意页面时,才会调用OnRemoteFailure
。
现在你可以这样做了:
-
在回调方法中检查返回的声明。
-
如果电子邮件声明丢失(或任何其他对您很重要的请求声明),请将用户重定向到处理此情况的自定义页面。从技术上讲,你可以将用户直接重定向回facebook,但不建议这样做。Facebook希望你向用户解释你为什么需要请求的范围(处理已撤销的权限)。
-
自定义启动登录过程的方法,以便您知道何时添加auth_type=rerequest,即当用户在步骤2)中按下类似"重试"的按钮时。
-
将
auth_type=rerequest
添加到AuthenticationProperties
var props = new AuthenticationProperties() { RedirectUri = Url.Action("ExternalLoginCallback"), Items = { { "returnUrl", returnUrl }, { "scheme", provider }, // if user wants to try again { "auth_type", "rerequest" } } }; return Challenge(props, provider);
-
实现
OnRedirectToAuthorizationEndpoint
来操作默认的质询重定向uriusing Microsoft.AspNetCore.WebUtilities; ... options.Events = new OAuthEvents { OnRemoteFailure = ... OnRedirectToAuthorizationEndpoint = context => { if (context.Properties.Items.ContainsKey("auth_type")) { context.RedirectUri = QueryHelpers.AddQueryString(context.RedirectUri, "auth_type", context.Properties.Items["auth_type"]); } context.Response.Redirect(context.RedirectUri); return Task.FromResult(0); } };
现在,同意页面在需要时再次显示。
希望这能有所帮助。