所以我试图在ASP.NET MVC 4中创建一个Hello World自定义角色提供程序解决方案。
基本上我已经在web.config中设置了authentication mode="Windows"
,并定义了这样的角色提供者:
<roleManager enabled="true" defaultProvider="MyRoleProvider">
<providers>
<clear />
<add name="MyRoleProvider" type="MyProject.Code.MyRoleProvider" />
</providers>
</roleManager>
然后我按照以下方式修饰了About
控制器方法:
[Authorize(Roles = "SomeRole")]
public ActionResult About()
{ /* ... */ }
自定义RoleProvider类如下所示:
namespace MyProject.Code {
public class MyRoleProvider : RoleProvider
{
public override bool IsUserInRole(string username, string roleName)
{
if (roleName == "SomeRole" && username = "Administrator") return true;
return false;
}
public override string[] GetRolesForUser(string username)
{
return new string[] { "SomeRole" };
}
/* a bunch of other overridden methods simply throwing not implementedException */
}
}
现在问题是我在MyRoleProvder
中的每一个可执行代码行都设置了一个断点,但没有一个被击中。我已经测试了其他地方的断点被击中,所以调试器不是问题。为什么我的代码没有执行所提供的角色?当我导航到关于页面时,我希望执行IsUserInRole
和/或GetRolesForUser
。我错了吗?我配置错了吗?
完整web.config以供参考
编辑:点击“关于”页面后,用户将被重定向到登录页面。我现在意识到这是由于用户实际上尚未经过身份验证。授权后自然会发生授权。 IISExpress不提供Windows身份吗?
答案 0 :(得分:1)
由于这是谷歌搜索的第一个结果,我想给出一个解决方案,也许对其他人来说:
要在 IIEExpress 中使用 windows 身份,您必须在您的 applicationhost.config 中激活它,它位于
[SolutionDir].vs\config\applicationhost.config
在那里你可以找到 xml 标签
<configuration>
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="false">
将 enabled="false" 更改为 enabled="true"
并且您可以在 IISExpress 中使用 windows 身份验证
答案 1 :(得分:0)
我认为您的类型声明不完整,您应该同时包含全名和程序集名称。
type="MyProject.Code.MyRoleProvider, MyProject"
如果您的程序集放在GAC中,您可能还需要设置Version,Culture和PublicKeyToken
希望这有帮助