ASP.NET的登录控制问题
我建立了一个使用此页上编写的SqlMembershipProvider的网站。
我遵循了每一个步骤。我有数据库,我修改了Web.config以使用此提供程序,并带有正确的连接字符串,并且身份验证模式设置为Forms。创建了一些要进行测试的用户。
我创建了一个Login.aspx并将其放在Login控件上。一切正常,直到用户可以登录为止。
我调用Default.aspx,它将重定向到Login.aspx,输入用户名和正确的密码。没有错误消息,似乎没有什么错,但是我再次看到"登录"表单,以输入用户的登录信息。但是,如果在浏览器中检查cookie,则可以看到存在具有指定名称的cookie。
我已经尝试自己处理这些事件并检查它们中发生了什么,但没有成功。
我正在使用VS2008,文件系统中的网站,SQL Express 2005来存储aspnetdb,没有角色管理,并已通过K-Meleon,IE7.0和Chrome测试。
有任何想法吗?
解决方案:在与Rob进行邮件联系后,我们有了理想的解决方案,现在它已成为公认的答案。
解决方案
回答
我们用来登录的用户名的作用是什么?我们是否允许此角色访问Default.aspx?
我曾经(很久以前)经历过一次,然后说"哦!"当我意识到连管理员角色都无法访问主文件夹时!
回答
我们是否检查过重定向路径已发送到登录表单?我想起来是ReturnURL吗?
回答
@Jon:我还没有使用角色。如果我检查了Web Admin Tool,它会说:未启用角色。
@Rob:是的,它在那里。
我还按顺序检查了事件:LoggingIn,Authenticate,LoggedIn,因此它遵循正确的路径,但没有重定向,也看不到它已通过身份验证。
回答
通常,我们具有一个具有通常可访问形式的初始文件夹,以及一个具有所有登录保护项目的单独文件夹。在初始文件夹中,我们具有以下Webconfig:
<!--Deny all users --> <authorization> <deny users="*" /> </authorization>
在另一个文件夹中,我们可以放置一个单独的webconfig,其设置如下:
<!--Deny all users unless autherticated --> <authorization> <deny users="?" /> </authorization>
如果要进一步优化,则只能允许访问特定角色。
<configuration> <system.web> <authorization> <allow roles="Admins"/> <deny users="*"/> </authorization> </system.web> </configuration>
这将拒绝没有管理员角色的任何人的访问,只有成功登录后,他们才能获得该权限。
如果我们需要一些好的背景知识,我建议在ASP.NET Membership上与Miguel Castro一起观看DNR电视节目
回答
不久前,我遇到了类似的问题,我记得它是通过不将登录页面命名为" login.aspx"来解决的。只需命名其他名称(例如,userLogin.aspx)即可为我解决。
回答
web.config中是否有requireSSL =" true"
?
我有类似的症状。如果将requireSSL设置为true,则还有一些其他注意事项。
回答
RE:公认的答案
我不喜欢给出的hack。
我有一个使用名为" login.aspx"的登录表单的站点,并且一切正常。我认为我们应该真正找到答案而不是破解。由于所有[大概]经过测试的网站都可以正常工作。我们不认为我们应该实际使用StackOverflow来发现ACTUAL问题吗? (使其比其他任何地方都有用吗?)
在LoginCtl_Authenticate事件中,我们是否将EventArgs.Authenticated属性设置为true?
例如
protected void LoginCtl_Authenticate(object sender, AuthenticateEventArgs e) { // Check the Credentials against DB bool authed = DAL.Authenticate(user, pass); e.Authenticated = authed; }
回答
@Rob:从角度来看,我们是对的。
从我的角度来看,检查一些东西是我的测试项目。如果它以任何方式工作,那都适合我。我还没有在网上发现任何类似的问题,因此它可能是与ASP.NET完全无关的其他问题。
但是我很开放,所以下次我还可以说:啊哈,我知道这一点!
我从项目开始:
Default.aspx:添加了LoginStatus和LoginName控件
Login.aspx:添加了Login控件和CreateUserWizard控件
web.config:已添加
<authentication mode="Forms"> <forms name="SqlAuthCookie" timeout="10" loginUrl="Login.aspx"/> </authentication> <authorization> <deny users="?"/> <allow users="*"/> </authorization> <membership defaultProvider="MySqlMembershipProvider"> <providers> <clear/> <add name="MySqlMembershipProvider" connectionStringName="MyLocalSQLServer" applicationName="MyAppName" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> </providers> </membership>
和
<connectionStrings> <add name="MyLocalSQLServer" connectionString="Initial Catalog=aspnetdb;data source=iballanb\sqlexpress;uid=full;pwd=full;"/> </connectionStrings>
使用" aspnet_regsql -E -S iballanb \ sqlexpress -A all"创建数据库,创建一个名为full且密码为full的SQL用户。
启动项目,我重定向到Login.aspx,创建一个用户,它是在数据库中创建的。输入用户数据以登录表单,捕获事件:LoggingIn,Authenticate,LoggedIn,因此我已登录(我在这些事件中不做任何事情,我不对自己进行身份验证,我只对触发的内容感兴趣,顺序)。 RedirectURL正确指向Default.aspx,但无效。
到此为止。
回答
如果要覆盖事件,是否要调用默认实现?如果要覆盖它们以确认它们的执行,那么实际的代码也不会被执行,这可能是管道中断的原因。
回答
我已经检查了我们发送给我的文件中的代码(再次感谢我们发送给我)。
注意:由于我尚未安装数据库等,因此尚未测试。
但是,我很确定这是问题所在。
我们需要为ASP.NET控件设置MembershipProvider属性。为它们定义:
<asp:Login ID="Login1" runat="server" MembershipProvider="MySqlMembershipProvider"> <LayoutTemplate> <!-- template code snipped for brevity --> </LayoutTemplate> </asp:Login>
和..
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" MembershipProvider="MySqlMembershipProvider"> <WizardSteps> <asp:CreateUserWizardStep runat="server" /> <asp:CompleteWizardStep runat="server" /> </WizardSteps> </asp:CreateUserWizard>
然后,这会将控件绑定到具有给定名称(在Web.Config中指定的名称)的Membership Provider。
在解决方案中旋转一下,让我知道情况。
我希望这对你有用:)
编辑
我还应该补充一点,我知道我们不需要这样做,因为已设置了默认提供程序,但是过去我在使用此程序时遇到了问题。
回答
我只是解决了这种情况的问题。签出会员资格提供者的applicationName。
http://weblogs.asp.net/scottgu/archive/2006/04/22/Always-set-the-2200_applicationName_2200-property-when-configuring-ASP.NET-2.0-Membership-and-other-Providers.aspx