未触发AuthorizationCodeReceived事件

时间:2018-12-13 12:50:42

标签: asp.net-mvc authentication owin openid-connect

我正在尝试在ASP.NET MVC 5(.Net Framework)应用程序中实现OpenId Connect中间件。

在我的AccountController.cs中,我发送一个OpenID Connect接收请求。我实现了另一个OpenId Connect中间件,这就是为什么我指定要挑战的中间件是“ AlternateIdentityProvider”。

    public void SignIn()
    {
        HttpContext.GetOwinContext().Authentication.Challenge(
            new AuthenticationProperties { RedirectUri = "/" },
            "AlternateIdentityProvider");
    }

在对中间件发出挑战后,RedirectToIdentityProvider中的Startup.cs事件被触发,我被重定向到提供者进行登录。但是,成功登录后,我被重定向到了指定的重定向uri加上状态和代码参数作为查询参数,即http://localhost:63242/singin-oidc/?state=State&code=AuthorizationCode(为简洁起见删除了参数),由于我的应用程序中不存在这样的路由,因此会产生404。

相反,我希望成功的登录触发AuthorizationCodeReceived事件,在该事件中我可以实现我的附加逻辑。实际上,其他任何事件都不会触发。

我在ASP.Net Core 2.1中实现了几乎相同的解决方案,在这里,我能够逐步解决触发的不同事件。

我当前的Startup.cs的相关代码如下所示。请注意,如果初始请求包含reponse_mode和某些遥测参数,则OpenId提供程序将引发错误,因此在初始RedirectToIdentityProvider事件期间将其删除。

有什么想法为什么没有在中间件中收到来自OpenId提供程序的回调?

        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions("AlternateIdentityProvider")
        {
            ClientId = { { Client Id } },
            ClientSecret = { { Client Secret } },
            Scope = OpenIdConnectScope.OpenId,
            ResponseType = OpenIdConnectResponseType.Code,
            RedirectUri = "http://localhost:63242/singin-oidc",
            MetadataAddress = { { Discovery document url } },

            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = context =>
                {
                    Debug.WriteLine("Redirecting to identity provider for sign in..");

                    context.ProtocolMessage.EnableTelemetryParameters = false;
                    context.ProtocolMessage.ResponseMode = null;

                    return Task.FromResult(0);
                },

                AuthorizationCodeReceived = context => {

                    Debug.WriteLine("Authorization code received..");
                    return Task.FromResult(0);
                },

                SecurityTokenReceived = context =>
                {
                    Debug.WriteLine("Token response received..");
                    return Task.FromResult(0);
                },

                SecurityTokenValidated = context =>
                {
                    Debug.WriteLine("Token validated..");
                    return Task.FromResult(0);
                },
            }
        });

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我正在尝试将Owin插入我们的旧版WebForms应用程序。

对我来说,我必须执行以下操作:

1)在Azure上更改应用程序定义的应用程序清单,将“ oauth2AllowIdTokenImplicitFlow”属性从 false 设置为 true

  1. 转到 Azure门户网站
  2. 选择以 Azure Active Directory
  3. 选择应用注册
  4. 选择您的应用。
  5. 点击清单
  6. 找到值 oauth2AllowIdTokenImplicitFlow ,并将其值更改为 true
  7. 点击保存

2)在您的startup.cs文件中,更改以下内容:

ResponseType = OpenIdConnectResponseType.Code

ResponseType = OpenIdConnectResponseType.CodeIdToken

一旦执行了这两件事,SecurityTokenValidated和AuthorizationCodeReceived就开始触发。

不过,我不确定这是否是正确的方法。需要做更多的阅读。

希望这会有所帮助。

答案 1 :(得分:0)

请注意,.Net Framework中的OpenId Connect实现仅支持response_mode = form_post。 (请参见closed GitHub issue

由于您将请求中的参数剥离给了OpenId Connect提供程序(在您的RedirectToIdentityProvider通知中),因此提供程序将默认为response_mode = query pr。规格。 (请参阅specs中的response_type和response_mode之间的关系。)

因此,简而言之,OpenId Connect中间件期望将进行HTTP POST(具有表单主体),并且您的提供程序将正确发送HTTP GET(具有作为查询字符串的参数)。