更改.Net核心OpenID连接授权流程'redirect_uri'值

时间:2018-04-12 17:16:43

标签: .net-core openid-connect onelogin

根据我的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?

谢谢!

1 个答案:

答案 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'值。不确定这是否是处理此问题的最佳方法,但它确实有效。