我有一个ASP.NET webforms网站,它使用.NET MySql连接器和MySql作为后端。我正在使用基于角色的身份验证来保护我网站的某些区域。问题是我将站点移动到服务器后,用户的角色信息没有被保留(在我的本地开发机器上正常工作)。发生的事情是我可以使用logincontrol登录,它在验证用户后将我引导到管理区域。此时User.IsInRole(“admin”)为true。但是,当我单击链接转到管理部分中的其他页面时,User.IsInRole(“admin”)为false。
的Web.config
<membership defaultProvider="MySqlMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<remove name="MySQLMembershipProvider"/>
<add name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.2.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="true" passwordFormat="Clear" maxInvalidPasswordAttempts="3" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="3" passwordStrengthRegularExpression="" autogenerateschema="true"/>
</providers>
</membership>
<profile>
<providers>
<remove name="MySQLProfileProvider"/>
<add name="MySQLProfileProvider" type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.2.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/"/>
</providers>
</profile>
<roleManager enabled="true" defaultProvider="MySqlRoleProvider">
<providers>
<remove name="MySqlRoleProvider"/>
<add name="MySqlRoleProvider" type="MySql.Web.Security.MySQLRoleProvider, MySql.Web, Version=6.2.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/"/>
</providers>
</roleManager>
Global.asax中
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.User != null) {
if (Request.IsAuthenticated == true) {
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
// In this case, ticket.UserData = "Admin"
string[] roles = new string[1] { ticket.UserData };
FormsIdentity id = new FormsIdentity(ticket);
Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
}
}
}
答案 0 :(得分:0)
您是在开发中使用不同的数据源还是在服务器上(我这样做)?如果是这样,请确保您的数据同步。仅当您在数据库连接中指定(local)
或.
作为服务器时,情况可能就是这种情况。
否则,输出到日志以查看用户角色曾是否包含“admin”。
答案 1 :(得分:0)
事实证明问题是我在web.config中禁用了整个站点的viewstate。一旦我重新启用了viewstate,角色信息就会像预期的那样持续存在。