LoginView在Account文件夹中工作,而不在网站的根文件夹中

时间:2011-12-29 02:57:21

标签: asp.net authentication account loginview

我一直在网上寻找我的问题的答案,并通过msdn网站阅读ASP.Net控件,安全性和身份验证,但要么找不到答案,要么错过了我读过的所有信息。

我正在ASP.Net v2.0中构建一个托管在远程服务器上的网站。我使用MySQL作为后端,它也包含用户表。我使用了与默认成员资格表中使用的用户表结构相同的用户表结构。应用程序中的文件夹都具有分配给它们的默认角色权限。

我在本地计算机上的测试中出现以下问题。

当我使用~/Account/Login.aspx页面登录用户时,我将用户重定向到~/Account/AccountDetails.aspx,其中包含LoginView。登录后,用户名在LoginView内的此页面上可见,并且已经过身份验证。

当我转到~/Default.aspx并使用LoginView的相同代码时,用户名不会显示,并且不再经过身份验证。

我不想创建多个页面来显示相同​​的数据,因为两者都登录,匿名用户需要在~/Default.aspx页面中看到相同的信息。我只是希望显示用户已登录Default.aspx页面或~/文件夹中的任何页面。

我知道这将是一个简单的设置或变更,如角色或会员资格等,但我无法弄明白。

我查看了stackoverflow并发现了很多LoginView个问题,但似乎无法找到一个回答我问题的问题。

我希望有人能够指出我正确的方向。

以下是Default.aspxAccountDetails.aspx页面上使用的代码。它是模板LoginView网站应用程序中的默认ASP.Net代码。

<div class="loginDisplay">
  User Authenticated? <%= Page.User.Identity.IsAuthenticated %>
  <asp:LoginView ID="HeadLoginView" runat="server">
    <AnonymousTemplate>
      [ <a href="~/Account/Login.aspx" ID="HeadLoginStatus" runat="server">Log In</a> ]
    </AnonymousTemplate>
    <LoggedInTemplate>
      Welcome <span class="bold"><asp:LoginName ID="HeadLoginName" runat="server" /></span>!
      [ <asp:LoginStatus ID="HeadLoginStatus" runat="server" LogoutAction="Redirect" LogoutText="Log Out" LogoutPageUrl="~/"/> ]
    </LoggedInTemplate>
  </asp:LoginView>
</div>  

~/Account/web.config文件包含以下内容:

<?xml version="1.0"?>  
<configuration>  

  <location path="Register.aspx">  
    <system.web>  
      <authorization>  
        <allow users="*"/>  
      </authorization>  
    </system.web>  
  </location>  


  <system.web>  
    <authorization>  
      <deny users="?" />  
    </authorization>  
  </system.web>  
</configuration>

~/web.config文件包含以下信息。我已经编辑了用户名和密码的一些值。我也删除了注释行。

<?xml version="1.0"?>  
<configuration>  
  <connectionStrings>  
    <add name="MySqlMembershipConnection" connectionString="Data Source=mydatasource;user id=dotnet;password=dotnet;" providerName="MySql.Data.MySqlClient" />    
    <add name="mycs" connectionString="Dsn=mydsn" providerName="System.Data.Odbc" />    
    <remove name="LocalMySqlServer" />    
    <add name="LocalMySqlServer" connectionString="database=mydsn;server=localhost;User Id=dotnet;password=dotnet" providerName="MySql.Data.MySqlClient" />    
  </connectionStrings>    
  <system.web>    
    <sessionState mode="Custom" cookieless="false" regenerateExpiredSessionId="true" customProvider="MySqlSessionStateProvider">    
      <providers>    
        <add name="MySqlSessionStateProvider" type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.4.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" applicationName="/" description="" connectionStringName="LocalMySqlServer" writeExceptionsToEventLog="False" autogenerateschema="True" />    
      </providers>    
    </sessionState>    
    <authentication mode="Forms">    
      <forms loginUrl="~/Account/Login.aspx" timeout="30" name=".ASPXFORM$" path="~/" requireSSL="false" slidingExpiration="true" defaultUrl="~/Default.aspx" enableCrossAppRedirects="false" />    
    </authentication>    
    <membership defaultProvider="MySQLMembershipProvider">    
      <providers>    
        <clear />    
        <remove name="MySQLMembershipProvider" />    
        <add name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.4.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" applicationName="/" description="mydescription" connectionStringName="LocalMySqlServer" writeExceptionsToEventLog="False" autogenerateschema="True" enablePasswordRetrieval="False" enablePasswordReset="True" requiresQuestionAndAnswer="True" requiresUniqueEmail="False" passwordFormat="Clear" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />    
      </providers>    
    </membership>    
    <profile defaultProvider="MySQLProfileProvider">    
      <providers>    
        <clear />    
        <remove name="MySQLProfileProvider" />    
        <add name="MySQLProfileProvider" type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.4.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" applicationName="/" description="" connectionStringName="LocalMySqlServer" writeExceptionsToEventLog="False" autogenerateschema="True" />    
      </providers>    
    </profile>    
    <roleManager enabled="true" defaultProvider="MySQLRoleProvider">    
      <providers>    
        <clear />    
        <add applicationName="/" name="AspNetWindowsTokenRoleProvider"
      type="System.Web.Security.WindowsTokenRoleProvider" />    
        <add applicationName="/" description="" connectionStringName="LocalMySqlServer"
      writeExceptionsToEventLog="False" autogenerateschema="True"
      name="MySQLRoleProvider" type="MySql.Web.Security.MySQLRoleProvider, MySql.Web, Version=6.4.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />    
      </providers>    
    </roleManager>    
    <customErrors mode="Off" />    
    <compilation debug="true" />    
  </system.web>    

  <system.net>    
    <mailSettings>    
      <smtp from="user@domain.com">    
        <network host="mail.domain.com" password="mypassword" userName="myusername" />    
      </smtp>    
    </mailSettings>    
  </system.net>    

  <system.webServer>    
    <modules runAllManagedModulesForAllRequests="true" />    
  </system.webServer>    

</configuration>    

1 个答案:

答案 0 :(得分:0)

经过多次测试后,我发现了问题所在。首先,我有三个连接字符串,一个用于数据,两个用于表单身份验证。我将两种表单身份验证连接字符串合并为一个连接字符串。这允许我有一个数据连接字符串和一个用于身份验证的连接字符串。

接下来,我想了解问题发生的位置,因此我在VS 2010中创建了一个新的空白ASP.NET网站,然后逐步添加,以支持MySQL。这是通过首先添加MySQL数据和Web引用,然后是连接字符串,最后是表单身份验证来完成的。

我注意到在system.web身份验证元素的forms元素中,它只包含loginURL和timeout属性,因此我通过为forms元素添加其他属性来测试应用程序,直到找到导致问题的属性。

在我的表单元素中,path属性设置为'〜/'。当我将其更改为“/”时,应用程序开始正常工作。