【问题标题】:Combining Forms auth and OpenIdConnect auth in the same WebForms app在同一个 WebForms 应用程序中结合 Forms auth 和 OpenIdConnect auth
【发布时间】:2018-03-23 01:59:58
【问题描述】:

我有一个旧的多租户 WebForms 应用程序,其中用户使用表单身份验证进行身份验证。我们正在将身份验证系统迁移到 IdentityServer4,但不能一次性完成,因此我们希望逐步将其介绍给我们的租户。这意味着我们需要同时使用 Forms Auth 和新的 OpenIdConnect Auth 运行 WebForms 应用程序。

我的问题是,每当我运行 HttpContext.Current.GetOwinContext().Authentication.Challenge() 时,我都会被重定向到 Login.aspx,因为:

<authentication mode="Forms">
  <forms name="AuthCookieName" loginUrl="~/Login.aspx" timeout="60" protection="All" requireSSL="true" enableCrossAppRedirects="true" />
</authentication>

我想要的是,每当有人导航到 /OIDC.aspx 时,挑战会将用户重定向到使用 OWIN 配置的 IdentityServer。对于所有其他请求,现有的 Forms 身份验证配置可以处理身份验证。

这可能吗?

【问题讨论】:

  • 你能做到吗?
  • 不,我从来没有让它正常工作。我们所做的基本上是从我们的 WebForms ann 中删除整个 OWIN 管道。然后,我们在 WebForms 应用程序中创建了一个单独的 HttpHandler,我们在其中更手动地处理传入的 JWT。不完美,但它有效。
  • 我们可以通过将 web.config 中的位置允许部分添加到 OKTA 登录页面来使某些东西正常工作。在我们的 webforms 项目中,我们仍然为 OWIN 注册启动类,在登录质询响应之后,我们退出 OWIN 并使用 FormsAuthentication.SetAuthCookie 自动登录用户。这避免了我们应用程序中多个身份上下文的混淆。如果您将 OWIN 与 FormsAuth 集成,SQLRoleManager 将停止工作,但是通过这种方法,我们可以不影响我们的应用程序,并且用户仍然可以通过 OKTA 进行身份验证。
  • @henningst 请问您是否需要使用 Okta.Sdk 库作为处理程序?我们仅使用 Okta.Aspnet nuget 库构建了上述解决方案,它能够处理挑战和声明等,而无需涉及令牌。但是由于多租户,我们遇到了一个问题,我们需要检查颁发者,然后发送特定的客户端 ID 和密码进行匹配。显然,我们需要实现一个授权代码流,但要找到如何使用 SDK 来实现这一点并不容易。

标签: asp.net authentication webforms openid-connect identityserver4


【解决方案1】:

HttpContext.Current.GetOwinContext().Authentication.Challenge() 将对默认安全方案进行身份验证质询 - 在这种情况下,您的身份验证是 Forms Auth。您可以传入一个字符串,表示在挑战中使用什么安全方案,例如HttpContext.Current.GetOwinContext().Authentication.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType)

【讨论】:

  • 我在运行.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType) 时得到了相同的结果。似乎表单身份验证覆盖了所有内容。有什么方法可以让这些身份验证类型分开,即使它们在同一个应用程序中运行?
【解决方案2】:

我通过在调用身份验证质询时设置Response.SuppressFormsAuthenticationRedirect 标志来防止不需要的重定向,例如:

HttpContext.Current.Response.SuppressFormsAuthenticationRedirect = true;
HttpContext.Current.GetOwinContext().Authentication.Challenge(
    new AuthenticationProperties { RedirectUri = "/Home.aspx" });

【讨论】:

    【解决方案3】:

    OIDC 使用回调 URL。此网络表单安全性限制此 url 并重定向到登录页面。允许使用位置标签访问该回调 url 对我有用。

        <authentication mode="Forms">
          <forms loginUrl="default.aspx" name=".CLFORMSAUTH" />
        </authentication>
        <authorization>
          <deny users="?" />
        </authorization>
      </system.web>
      <location path="authorization-code/callback">
        <system.web>
          <authorization>
            <allow users ="*" />
          </authorization>
        </system.web>
      </location>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2013-01-05
      • 2017-04-23
      • 2019-06-08
      相关资源
      最近更新 更多