未调用自定义角色提供程序我究竟做错了什么?

时间:2014-03-10 15:16:17

标签: asp.net asp.net-mvc

所以我试图在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身份吗?

2 个答案:

答案 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

希望这有帮助