如何在ASP.NET Core上设置OpenIdConnectOptions的redirect_uri参数

23

我正在尝试使用OpenId将一个ASP.NET应用程序连接到Salesforce,目前这是我的连接代码。我认为除了redirect_uri参数,其他都已经搞定了,该参数必须与另一端的值完全匹配。


 app.UseCookieAuthentication(x =>
        {
            x.AutomaticAuthenticate = true;
            x.CookieName = "MyApp";
            x.CookieSecure = CookieSecureOption.Always;
            x.AuthenticationScheme = "Cookies";
   
        });

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();


        app.UseOpenIdConnectAuthentication(x =>
        {
            x.AutomaticAuthenticate = true;
            x.Authority = "https://login.salesforce.com";
            x.ClientId = "CLIENT_ID_HERE";
            x.ResponseType = "code";
            x.AuthenticationScheme = "oidc";
            x.CallbackPath = new PathString("/services/oauth2/success");
            //x.RedirectUri = "https://login.salesforce.com/services/oauth2/success";
            x.Scope.Add("openid");
            x.Scope.Add("profile");
            x.Scope.Add("email");                
        });

但是 RedirectUri 不是一个有效的参数。正确的设置方式是什么?


1
对于OIDC,请添加 x.SignInScheme = "Cookies" 并删除 x.AutomaticAuthenticate - Tratcher
3个回答

42

你需要为OnRedirectToIdentityProvider设置一个事件监听。

在你的情况下:

x.Events.OnRedirectToIdentityProvider = async n =>
{
    n.ProtocolMessage.RedirectUri = <Redirect URI string>;
    await Task.FromResult(0);
}

1
生产过程中总是需要一些手动操作。至少他们通过事件形式提供了扩展点。 - Mabakay
太棒了,今天解决问题了。谢谢你! - ScottG
4
在.NET 4.6及所有版本的.NET Core中,您可以使用Task.CompletedTask代替创建新任务。 - JLRishe

24

redirect_uri会根据当前请求的协议、主机、端口和路径以及您指定的CallbackPath自动计算。

看起来x.RedirectUri = "https://login.salesforce.com/services/oauth2/success"非常可疑(除非您是Salesforce的员工):不要忘记这是用户代理完成认证流程后将被重定向到的回调URL,而不是您身份提供者的授权终点。

因此,在您的情况下,用户将被重定向到http(s)://yourdomain.com/services/oauth2/success。 这是您在Salesforce选项中注册的地址吗?


非常适用于反向代理! - Mabakay
2
如果redirect_uri是自动计算的,那么如何处理一个在https://some.friendly.url.com上提供服务但在Azure上托管在https://some-ugly-hidden-url.not.to.be.used的应用程序?请看一下这个 - ChiefTwoPencils

1
问题:应用服务的默认域名为*.azurewebsites.net(例如contoso.azurewebsites.net),与应用程序网关的域名(例如contoso.com)不同。由于客户端的原始请求具有应用程序网关的域名contoso.com作为主机名,应用程序网关将主机名更改为contoso.azurewebsites.net,以便后端的应用服务可以将其路由到正确的终点。但是,当应用服务发送重定向响应时,它在响应的位置标头中使用与从应用程序网关接收到的请求中相同的主机名。因此,当应用服务执行重定向到其相对路径(从/path1重定向到/path2)时,客户端将直接发出请求到contoso.azurewebsites.net/path2,而不是通过应用程序网关(contoso.com/path2)。这将绕过应用程序网关,这是不可取的。
解决方案:可以通过将位置标头中的主机名设置为应用程序网关的域名来解决此问题。
有关更多详细信息,请查看此链接:https://azure.microsoft.com/en-us/blog/rewrite-http-headers-with-azure-application-gateway/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接