ASP.NET的登录控制问题

时间:2020-03-05 18:53:12  来源:igfitidea点击:

我建立了一个使用此页上编写的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