我正在尝试在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);
},
}
});
答案 0 :(得分:0)
我遇到了同样的问题。我正在尝试将Owin插入我们的旧版WebForms应用程序。
对我来说,我必须执行以下操作:
1)在Azure上更改应用程序定义的应用程序清单,将“ oauth2AllowIdTokenImplicitFlow”属性从 false 设置为 true 。
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(具有作为查询字符串的参数)。