根据我的IdP示例说明(https://www.onelogin.com/blog/how-to-use-openid-connect-authentication-with-dotnet-core),我已使用授权代码模型配置.Net Core Web应用程序以使用OpenID Connect进行身份验证:
services.AddAuthentication(options => {
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(o => {
o.ClientId = "[Client ID]";
o.ClientSecret = "[Client Secret]";
o.Authority = "[Authority]";
o.ResponseType = "code";
o.GetClaimsFromUserInfoEndpoint = true;
});
然后我的控制器设置为要求身份验证:
[Authorize]
public IActionResult About()
{
ViewData["Message"] = "You must be authenticated to view the About page";
return View();
}
我还配置了ngrok以提供临时公共URL,该URL应该在身份验证流程中使用以下方式重定向回我的网站:
ngrok http 5000 -host-header="localhost:5000"
此命令成功设置代理,一旦运行,我可以通过代理网址浏览到该网站(例如https://75c97570.ngrok.io)。
我遇到的问题是,当我尝试浏览到“关于”页面时,我被重定向到IdP站点并提示按预期登录,但是,'redirect_uri'值通过查询字符串是我的'localhost'地址(https://localhost:5000/signin-oidc)而不是ngrok代理地址(https://75c97570.ngrok.io/signin-oidc)。这导致了一个问题,因为我的IdP需要一个非本地URL(因此是ngrok代理),因此传递的redirect_uri值(localhost)与我的IdP帐户(ngrok)中配置的值不匹配,并且收到错误消息'redirect_uri与任何客户注册的redirect_uris都不匹配。
我假设这是一个.Net配置问题。有没有办法告诉.Net在重定向上使用ngrok代理地址作为'redirect_uri'值而不是localhost地址?我尝试在OpenID Connect配置选项上使用'CallbackPath'选项,但是看起来这只允许当前URL的子路径(例如http://localhost:5000/[something])并且不能用于指定完全不同的网址。是否有其他方法可以配置重定向以使用代理URL?
谢谢!
答案 0 :(得分:1)
好的,经过一番挖掘后,我找到了解决这个问题的方法。我将以下代码添加到OpenIdConnect服务的初始化中:
.AddOpenIdConnect(o => {
...(snip)...
o.Events.OnRedirectToIdentityProvider = (context) =>
{
context.ProtocolMessage.RedirectUri = "https://75c97570.ngrok.io/signin-oidc";
return Task.FromResult(0);
};
...(snip)...
}
这样可以更改在重定向上传递给我的IdP的'redirect_uri'值。不确定这是否是处理此问题的最佳方法,但它确实有效。