【问题标题】:Azure AD reply url: how to add several urls when using openid connect authAzure AD回复url:使用openid connect auth时如何添加多个url
【发布时间】:2018-04-05 16:29:55
【问题描述】:

我正在尝试构建一个不允许访问匿名用户的 ASP.NET MVC 应用程序(除了要显示给不允许使用该应用程序的经过身份验证的用户的自定义 URL) .

现在,我已在 azure 门户 (portal.azure.com) 中注册了我的应用,并且我想使用多个 URL。我添加了两个条目:

  1. https://localhost/test
  2. https://www.test.com

我正在使用以下代码在启动时配置身份验证:

public void ConfigureAuth(IAppBuilder app) {
    app.SetDefaultSignInAsAuthenticationType(
          CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions {                                                                                        
          ClientId = clientId,                                                                                        
          Authority = authority,                                                                                        
          PostLogoutRedirectUri = postLogoutRedirectUri,                                                                                        
          Notifications = new OpenIdConnectAuthenticationNotifications {
            SecurityTokenValidated = VerificaUtilizadorAutenticado,
            AuthenticationFailed = TrataErroAutenticacao
         }
     });
}

一切似乎都运行良好,但在发布应用程序后,我似乎只能使用其中一个 URI。我已经搜索过,似乎我可以使用 OpenIdConnectAuthenticationOptions 的 RedirectUri 属性来设置回复网址。因此,我尝试将其添加到设置中:

RedirectUri = "https://localhost/test",

不幸的是,这样做会破坏一切,并且浏览器会卡在我的应用程序和 MS 的登录页面之间。由于用户已登录,它将用户重定向回我的应用程序。但是,设置 RedirectUri 属性似乎不会生成应用的身份验证 cookie,因此会将用户发送回登录页面。

如果我删除 RedirectUri,我会被重定向到 https://www.test.com 站点,即使我正在尝试访问 https://localhost/test 网络应用程序。

我不确定是什么,但我遗漏了一些东西......有人可以帮忙吗?

谢谢。

路易斯

【问题讨论】:

  • 能否分享一下用户登录界面的网址。如果您做的正确,该网址中应该有一个查询字符串参数,例如:&redirect_uri=https://localhost/test.
  • 你好,肖恩。它没有被设置。没有redirect_uri参数...似乎它总是会重定向到第一个url...

标签: asp.net-mvc azure-active-directory openid-connect


【解决方案1】:

当您发送想要登录到 AAD 登录端点 (https://login.microsoftonline.com) 的用户时,您需要指定您希望将用户(和授权码)重定向回的位置。

您可以通过两种方式指定:

  1. 作为应用创建的一部分,您必须在应用的主配置中配置回复 URL。
  2. 您必须在登录 URL 中指定一个回复 URL,该 URL 与您配置的其中一个 URL 完全匹配:

    来自Authorization Code Grant Flow documentation

    https://login.microsoftonline.com/{tenant}/oauth2/authorize?
    client_id=6731de76-14a6-49ae-97bc-6eba6914391e
    &response_type=code
    &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F   <-- this guy
    &response_mode=query
    &resource=https%3A%2F%2Fservice.contoso.com%2F
    &state=12345
    

如果您未在登录 URL 中指定重定向 URI,用户将被重定向到您的应用注册中指定的第一个 URL。这听起来还不错,但要知道 AAD 将您的回复 URL 视为无序列表,因此根据您点击的服务器或数据的复制方式,您可能会在不同的登录尝试中观察到不同的重定向行为。这就是为什么始终在您的登录端点中指定 redirect_uri 参数很重要的原因。

我觉得如果您使用ADAL libraries 进行身份验证而不是示例代码中显示的库,我觉得您的许多问题可能会得到解决,但如果您不想使用这些,那么您需要分享更多详细信息就像身份验证过程的 HTTP 跟踪一样。

【讨论】:

  • 你好肖恩。感谢您的彻底答复。我同意你的观点,但是如果我这样做(并且我已经尝试过),我会在重定向之间卡住(在登录 azure 广告后,我会被重定向到主页,然后我会立即再次重定向回登录页面 - 这让我返回回到该网站,因为我之前已经登录过......而且它还在继续......)。关于他的代码,当我将应用程序连接到天蓝色时,它是由 vs 自动生成的……我希望一切都能顺利进行……但似乎情况并非如此……
  • 不幸的是,仅基于行为,很难调试您的问题。我的问题是:“是否成功获取了验证码?您是否成功地将该验证码交换为访问令牌?该访问令牌是否正确存储在您的令牌缓存中?等等......”您真的非常依赖图书馆在这里做“正确的事情”,而不是真正调查图书馆应该做的各个步骤。我认为这就是您需要开始对该问题进行调查的地方。否则,请使用已知的工作示例here
  • 你好肖恩。是的,很多事情都可能出错。我认为这里的问题是重定向uri应该在管道中间件内部处理,以便它生成用于身份验证的cookie。当我将redirecturi 设置为主页时,我确实会被重定向到我的主页,但由于用户只通过了外部提供商的身份验证,因此没有身份验证cookie。所以将用户重定向到主页意味着产生一个新的 401 挑战......我想我得看看源代码才能看到这里发生了什么......
  • 如何在请求期间动态指定redirect_uri?我需要将其中一些重定向到tenant1.test.com,一些重定向到tenant2.test.com。我想我需要以某种方式修改请求并注入这个重定向 uri,但我找不到
  • 您可以将两个回复 url 添加到您的应用程序配置中,然后使用您的应用程序逻辑来修改预期的回复 url。在他们开始登录过程之前
【解决方案2】:

好的,经过一番挖掘,我注意到我在设置 redirecturi 时遇到的问题是我缺少...一个斜杠 (/)。因此,将 / 添加到门户网站上定义的 URL 并将其也放入 options 对象的 redirecturi 就足以使其适用于不同的 URI...

【讨论】:

  • 你的意思是一个斜杠,即example.com/authsite?现在对我来说,它总是将用户重定向回example.com(并忽略我的应用程序身份验证站点)
  • 是的,我必须添加尾部斜杠(在您的示例中,它看起来像 example.com/authsite/,其中 authsite 是在默认 IIS 网站中创建的应用程序的名称)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2018-01-08
相关资源
最近更新 更多