在Azure上使用表单身份验证和SqlMembership Provider连接ASP.NET Web应用程序

在Azure上使用表单身份验证和SqlMembership Provider连接ASP.NET Web应用程序,asp.net,azure,asp.net-membership,membership-provider,Asp.net,Azure,Asp.net Membership,Membership Provider,我正在试用Microsoft Azure portal,以便以最少的重写量查看我的遗留应用程序的性能。身份验证是一个问题 背景:此ASP.NET web应用程序当前使用SqlMembership提供程序进行用户、角色、配置文件和个性化设置。是的,有很多关于ASP.NET身份、简单成员、通用提供者的博客,而且ASP.NET SqlMembership提供者正在被淘汰。但是,如果可能的话,我还是宁愿在Azure上使用传统的asp.net成员资格 目前,我可以将我的VS.NET 2013解决方案发布到

我正在试用Microsoft Azure portal,以便以最少的重写量查看我的遗留应用程序的性能。身份验证是一个问题

背景:此ASP.NET web应用程序当前使用SqlMembership提供程序进行用户、角色、配置文件和个性化设置。是的,有很多关于ASP.NET身份、简单成员、通用提供者的博客,而且ASP.NET SqlMembership提供者正在被淘汰。但是,如果可能的话,我还是宁愿在Azure上使用传统的asp.net成员资格

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

我在SQLAzure上创建了sql成员表,使用了SQLAzure的特殊Azure友好脚本(此处:)

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

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

My 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>

多亏了上面的Simon W,我发现了我的问题。在Azure门户中,有一个控制“Azure网站身份验证/授权”的设置。它可以在网站下找到,然后配置,然后向下滚动到“Azure网站身份验证/授权”。在我的例子中有一个条目:我的网站被绑定到我帐户的“目录”中,“应用程序”被设置为我的“租户”(我想这是Azure术语)

为了解决这个问题,我只需删除门户中的条目,就可以完美地登录到我的web应用程序。连接到成员资格的表单身份验证正如我所期望的那样工作

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


西蒙,我不知道怎么才能相信你的答案。。。你基本上让我的头指向了正确的方向(只是使用“Azure AD authentication”在谷歌上搜索了正确的术语)并促进了修复。

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