【发布时间】: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