在 Web API 中使用 Windows 身份验证的自定义 RoleProvider

Custom RoleProvider with Windows Authentication in Web API

我有一个 WebAPI 项目,我需要在其中对用户使用 Windows 身份验证,但要为路由上方的授权属性实施自定义角色提供程序。然而,当我实现它时,我总是得到 {"Message":"Authorization has been denied for this request."} 作为我的调用结果。此外 none 我的断点除了自定义角色提供者的构造函数中的断点

控制器

[Authorize(Roles="Administrator")]
[RoutePrefix("api/Constituents")]
public class ConstituentsController : ApiController
{
[Route("Constituents")]
    [HttpGet]
    public IDataResponse<List<IConstituent>> GetConstituents()
    {
        return service.GetConstituent();
    }

自定义角色提供商

public class CustomRoleProvider : RoleProvider
{
    public CustomRoleProvider()
    {
        this.UserRepo = new UserRepository();  //Breakpoint here triggers
        this.RoleRepo = new RoleRepository();
    }
    public override string[] GetRolesForUser(string username)
    {
        var roles = UserRepo.GetUser(username)?.Roles?.Select(r => r.Name).ToArray();
        return roles;
    }
    public override bool IsUserInRole(string username, string roleName)
    {
        var user = UserRepo.GetUser(username);
        return user.Roles.Select(r => r.Name).Contains(roleName); 
    }

网络配置

<authentication mode="Windows"/>
  <roleManager cacheRolesInCookie="false"
        defaultProvider="CustomRoleProvider"
        enabled="true">
<providers>
    <clear />
    <add name="CustomRoleProvider"
        type="Data.CustomRoleProvider, Data" />
</providers>

我错过了什么拼图?我需要让当前用户发出请求,然后检查他们是否在数据库中具有适当的角色。

谢谢

默认情况下,Visual Studio 将项目的 Windows 身份验证 属性 设置为禁用。在 Properties 窗格(不是选项卡)中,您需要将 属性 翻转为 Enabled。那应该可以让您在 RoleProvider 上设置断点。

当您将应用程序放在服务器上时,您可能必须在 IIS 中执行类似的过程以启用 Windows 身份验证和禁用匿名身份验证。