Skip to main content
 首页 » 编程设计

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

2024年02月05日2852php

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

Controller

[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 Pane (不是选项卡)中,您需要将属性翻转为 Enabled。这应该可以让您在 RoleProvider 上设置断点。

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