【问题标题】:Wiring up ASP.NET Web Application using Forms Authentication with SqlMembership Provider on Azure在 Azure 上使用带有 SqlMembership 提供程序的表单身份验证连接 ASP.NET Web 应用程序
【发布时间】:2014-11-18 02:29:25
【问题描述】:

我正在尝试使用 Microsoft Azure 门户,以了解我的旧应用程序如何以最少的重写量执行。身份验证是个问题。

背景:此 ASP.NET Web 应用程序当前使用 SqlMembership 提供程序来处理用户、角色、配置文件和个性化。是的,有很多关于 ASP.NET 身份、简单成员、通用提供程序以及 asp.net SqlMembership 提供程序正在逐步淘汰的博客。但是,如果可能的话,我还是宁愿在 Azure 上使用旧的 asp.net 成员资格。

目前,我可以将我的 VS.NET 2013 解决方案发布到 Azure,但我无法登录。一旦我导航到该 url,它就会自动将我作为 Azure 门户用户登录。似乎 Windows 身份验证处于活动状态,而不是表单。我是这样来的:

我使用适用于 Sql Azure 的特殊 Azure 友好脚本在 Sql Azure 上创建了 sql 成员表(此处为:https://support.microsoft.com/kb/2006191)。

但是,当我在 azure 站点上运行我的应用程序与在本地运行它时,我会看到不同的行为。在 azure 上采用不同的身份验证机制:首先,系统会提示我使用我的组织 ID(这是我的 msdn 电子邮件)登录,然后在我输入 Azure 登录名后,我会自动以 live.com 身份登录我的应用程序# myazureid@domain.com 并且我没有被重定向到 default.aspx,但 login.aspx 和 web.sitemap 菜单都不会出现,除了可供未经身份验证的用户使用的菜单。我还在门户网站 jeff@mydomain.onmicrosoft.com 中创建了第二个用户,系统提示我通过实时登录,然后自动登录到应用程序。基本上它的行为就像 Windows 身份验证处于活动状态,而不是表单身份验证。 (澄清:我后来发现这种行为是 Azure Active Directory。)

相比之下,当我的应用程序在本地运行(vs.NET 2013)并且我的连接字符串指向同一个 sql azure 数据源(成员资格表)时,我按预期登录:我输入我的成员身份用户名/密码和我看到我的默认页面和绑定到我的角色的页面是可访问的,用户存在于用户表中,等等。显然我的本地运行时环境和 azure 是不同的,似乎 Azure 以某种方式覆盖了我的 web.config 提供程序设置并使用它自己的机制。

我的 web.config:

<authentication mode="Forms">
   <forms cookieless="UseCookies" defaultUrl="~/Default.aspx" loginUrl="~/PagesAnon/userLogin.aspx" requireSSL="false" slidingExpiration="true" timeout="45" />
</authentication>
<membership defaultProvider="AspNetSqlMembershipProvider" userIsOnlineTimeWindow="2">
 <providers>
    <clear />
    <remove name="AspNetSqlMembershipProvider" />
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="4" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
  </providers>
</membership>
<roleManager defaultProvider="AspNetSqlRoleProvider" enabled="true" cacheRolesInCookie="true">
  <providers>
    <clear />
    <remove name="AspNetSqlRoleProvider" />
    <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</roleManager>

【问题讨论】:

  • 网站和 Web 角色只是标准的 Web 服务器,因此在服务器级别没有什么特别的。您应该检查您没有在 build/package/publish 上进行 web.config 转换,该转换正在添加声明身份验证来代替现有的表单身份验证。
  • 西蒙,感谢您的回复。我确实在做 web.config 转换,但我已经仔细检查了它们,它只设置了 customErrors、debug 等。我没有在转换期间更改身份验证方案,我正在查看 azure 上的 web.config现在的站点,它包含身份验证模式=“表单”。门户中是否会有一些设置来控制身份验证机制?我一直在 azure 门户中寻找类似的东西,但无济于事。
  • 在您发布的 web.config 中是否使用了 System.IdentityModel 节点?您是否在多个位置尝试过多个浏览器?您使用的 URL 是否曾在您的组织中用于其他事情?您是否尝试过发布到其他网址?
  • 嗨,Simon,不,在 IdentityModel 的 web.config 中搜索未找到任何匹配项。我已经在我家的工作站上尝试了 IE、FF 和 Chrome,并从我的一台服务器上尝试了 IE 和 FF,该服务器与我当前位置相距 3 个时区,并且都表现出相同的行为:首先提示我的 azure 登录随后通过重定向到应用程序并使用 azure id 自动登录。该网址对我来说是全新的,因为我前几天才发布到 Azure。当然,我可以尝试稍后重新发布到另一个网站。
  • 我会向后工作并从没有内置身份验证的基本站点开始。您描述的行为是使用 Azure AD 身份验证,这需要为其配置和注册应用程序。这是基于声明的身份验证,与传统的集成 Windows 身份验证不同。您能否检查嵌套的 web.config 文件,如果有,请确保它们未配置为使用声明身份验证 (system.IdentityModel)。

标签: asp.net azure asp.net-membership membership-provider


【解决方案1】:

感谢上面的 Simon W,我发现了我的问题。在 Azure 门户中,有一个设置可以控制“Azure 网站身份验证/授权”。它在网站下找到,然后是配置,然后向下滚动到“Azure 网站身份验证/授权”。就我而言,那里有一个条目:我的网站与我的帐户的“目录”相关联,并且“应用程序”设置为我的“租户”(我认为这是 Azure 术语)。

要解决此问题,我只需删除门户中的条目,就可以完美地登录到我的 Web 应用程序。连接到 Membership 的表单身份验证正在按我的预期工作。

我相信我使用 VS.NET 2013 Publish(使用安装了 Azure SDK 工具的服务器资源管理器)发布了原始网站,并且可能有一个默认设置可以在这种情况下启用 Azure AD。直到我回溯我的步骤并稍后确认这一点,我才会知道。当我使用门户创建新网站时,它不会默认使用此方案。

Simon,我不知道如何评价你的答案......你基本上让我的头指向了正确的方向(只是使用“Azure AD 身份验证”来搜索正确的术语)并促进修复。

【讨论】:

  • 没有戏剧性 - 你自己想出来的:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2022-10-25
  • 2018-08-11
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
相关资源
最近更新 更多