在实现自定义ASP.NET RoleProvider时遇到了困难。
首先,让我向您展示我的web.config文件中的相关设置:
<?xml version="1.0"?>
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx"
name="FormsAuthentication"
path="Default.aspx"
timeout="20"/>
</authentication>
<membership defaultProvider="MembershipProvider">
<providers>
<clear />
<add name="MembershipProvider"
type="CompanyName.Security.MembershipProvider" />
</providers>
</membership>
<roleManager defaultProvider="RoleProvider"
enabled="true">
<providers>
<clear />
<add name="RoleProvider"
type="CompanyName.Security.RoleProvider" />
</providers>
</roleManager>
</system.web>
<location path="Employees.aspx">
<system.web>
<authorization>
<deny users="?"/>
<allow roles="Employees"/>
</authorization>
</system.web>
</location>
</configuration>以下是登录按钮的事件处理程序的代码:
if (Membership.ValidateUser(tbxUsername.Text, tbxPassword.Text))
Response.Redirect("./Employees.aspx");
else
{
tbxUsername.Text = string.Empty;
tbxPassword.Text = string.Empty;
tbxUsername.Focus();
lblLogin.Visible = true;
}基于()建议的FormsAuthentication.RedirectFromLoginPage()建议:
有人建议我使用FormsAuthentication.RedirectFromLoginPage()而不是Response.Redirect()。最后,我想根据用户的角色将用户重定向到另一个页面。我不知道FormsAuthentication.RedirectFromLoginPage()如何允许我这样做,因为它不接受重定向url作为参数。此外,我的理解是,我可以在FormsAuthentication.SetAuthCookie()之前调用Response.Redirect(),以便创建FormsAuthentication.RedirectFromLoginPage()创建的身份验证cookie。如果我的思维过程是错误的,请告诉我。
在遍历源代码之后,我可以看到Membership.ValidateUser()正在执行我的自定义MembershipProvider类的ValidateUser()函数。但是,当有效用户登录并重定向到Employees.aspx时,用户将返回到Login.aspx**?ReturnUrl=%2fEmployees.aspx**。我认为这是因为尽管用户进行了身份验证,但s/他对Employees.aspx资源的授权失败了。
根据这个假设,我在我的自定义RoleProvider类中的每个函数上创建了断点,以查看事情在哪里运行。当我调试时,它们中没有一个会中断执行。我的RoleProvider中的大多数代码都会抛出NotYetImplementetExceptions,但我仍然希望命中断点(然后实现这些所需的函数)。下面是我实现的两个dumbed函数:
public override string[] GetRolesForUser(string username)
{
return new string[1] {"Employees"};
}
public override bool IsUserInRole(string username, string roleName)
{
return true;
}我假定,由于RoleProvider代码从来不执行,所以我的web.config肯定有问题。
在过去的两天里,我一直在寻找这个问题的答案,并且尝试了各种各样的改变,但都没有成功。有人看到我哪里出错了吗?
提前感谢!
发布于 2009-11-09 07:54:59
我将路径值(见下面)从"Default.aspx“更改为"/”,现在正在命中自定义RoleProvider中的断点!
不工作
<authentication mode="Forms">
<forms loginUrl="Login.aspx"
name="FormsAuthentication"
path="Default.aspx"
timeout="20"/>
</authentication>Works
<authentication mode="Forms">
<forms loginUrl="Login.aspx"
name="FormsAuthentication"
path="/"
timeout="20"/>
</authentication>发布于 2009-11-09 06:34:11
在使用Membership.ValidateUser对用户进行身份验证之后,应该调用FormsAuthentication.RedirectFromLoginPage而不是Response.Redirect来创建表单身份验证票证。
有关示例,请参见用于Membership.ValidateUser的MSDN文档。
编辑
或者,如果要重定向到特定页面,请调用FormsAuthentication.SetAuthCookie在调用Response.Redirect之前创建窗体身份验证票证。
它将经过验证的用户重定向到default.aspx。
实际上,它重定向回最初请求的页面,这不一定是default.aspx。
编辑2
此外,您的配置也有一个问题:
发布于 2009-11-09 06:32:51
检查用户是否在角色中:
If (Roles.IsUserInRole("Employees"))
{
}或者在没有角色检查的情况下尝试:
<allow users="*"/>也许可以帮助更改配置:
<location path="Employees.aspx">
<system.web>
<authorization>
<allow roles="Employees"/>
<deny users="*"/>
</authorization>
</system.web>
</location>https://stackoverflow.com/questions/1699335
复制相似问题