在Open Id Connect中处理失败的静默身份验证

时间:2018-08-15 13:25:00

标签: asp.net-mvc identityserver4 openid-connect

我有一个使用Open Id Connect与Identity Server进行身份验证的ASP.NET站点。 身份验证令牌即将到期时,我添加了一个静默身份验证(提示=无),该身份验证将续签令牌,而不会向用户显示任何登录对话框。 只要用户仍登录到Identity Server,此方法就可以正常工作。

如果用户不再登录,则返回“ login_required”错误。我想通过仅让其静默失败并将用户重定向到身份验证开始的页面来处理此错误。 当由于AuthenticationFailed通知而返回错误时,RedirectUri似乎不可用。出现错误后,有什么方法可以访问RedirectUri?

我的配置看起来像这样(缩写):

    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions {
...
Notifications = new OpenIdConnectAuthenticationNotifications
{
    AuthenticationFailed = context =>
    {
        // if we failed to authenticate without prompt
        if (context.ProtocolMessage.Error == "login_required")
        {
            context.HandleResponse();
            //context.Response.Redirect("The url to the page where RedirectToIdentityProvider was triggered");
            return Task.FromResult(0);
        }

        context.HandleResponse();
        context.Response.Write(context.Exception.Message);
        return Task.FromResult(0);
    },
    RedirectToIdentityProvider = async context =>
    {
        ...

        if (ShouldReAuthenticate())
        {
            context.ProtocolMessage.SetParameter("prompt", "none");
        }

        ...
    }
}

});

1 个答案:

答案 0 :(得分:0)

我设法通过使用ISecureDataFormat.Unprotect()方法读取状态消息中的信息来解决此问题。

它可能可以做得更优雅,但类似这样:

        if (!string.IsNullOrEmpty(context.ProtocolMessage.State) ||
            context.ProtocolMessage.State.StartsWith("OpenIdConnect.AuthenticationProperties="))
        {
            var authenticationPropertiesString = context.ProtocolMessage.State.Split('=')[1];

            AuthenticationProperties authenticationProperties = context.Options.StateDataFormat.Unprotect(authenticationPropertiesString);

            return authenticationProperties.RedirectUri;
        }