如果用户拒绝作用域,则重新请求fb对话框-Identityserver4



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

现在你可以这样做了:

  1. 在回调方法中检查返回的声明。

  2. 如果电子邮件声明丢失(或任何其他对您很重要的请求声明),请将用户重定向到处理此情况的自定义页面。从技术上讲,你可以将用户直接重定向回facebook,但不建议这样做。Facebook希望你向用户解释你为什么需要请求的范围(处理已撤销的权限)。

  3. 自定义启动登录过程的方法,以便您知道何时添加auth_type=rerequest,即当用户在步骤2)中按下类似"重试"的按钮时。

  4. 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);
    
  5. 实现OnRedirectToAuthorizationEndpoint来操作默认的质询重定向uri

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

现在,同意页面在需要时再次显示。

希望这能有所帮助。

最新更新