使用带有授权属性的IIS基本身份验证允许WebApi2中的用户角色

时间:2014-06-04 14:39:06

标签: c# authentication asp.net-web-api asp.net-web-api2

我有一个.net WebApi2项目。我正在使用提供基本身份验证的IIS。

有2个客户端需要访问此Web服务,并且有2个控制器。 Controller#1 = EmployeeController和Controller#2 = InvoiceController我有一个列出用户名和角色的数据库。 Role1 = EmployeeUsers和Role2 = InvoiceUsers。

我想使用Authroize属性......

[Authorize(Roles = "EmployeeUsers ")]
public class EmployeeController : ApiController
{

}

[Authorize(Roles = "InvoiceUsers")]
public class InvoiceController : ApiController
{

}

没有授权属性我可以通过Request.GetRequestContext()获得经过身份验证的用户.Crincipal但我只能在用户通过身份验证并允许访问控制器之后才能访问。

我希望能够获得基本身份验证用户信息(请记住,IIS正在处理基本身份验证)并使用[Authorize]属性允许基于用户可能处于的某些角色访问控制器...但在什么时候我可以访问经过身份验证的用户(Principal),检查他的角色,并允许[Authorize]属性执行其工作或允许或拒绝访问某些控制器?

仅供参考... IIS必须用于处理基本身份验证...因此在IIS中设置了基本身份验证,我的web.config具有身份验证模式=" Windows"集。

如何使用Authorize属性根据通过IIS验证的用户限制对控制器的访问?

1 个答案:

答案 0 :(得分:0)

我没有太多使用IIS进行身份验证的经验but you can create your own attribute that inherits from AuthorizeAttribute,因此您可以使用以下内容进行自己的操作:

public class MyAuthorizationAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            var principal = actionContext.Request.GetRequestContext().Principal;
            if (!principal.IsInRole(this.Roles))
            {
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
            }
        }
    }

然后你用[MyAuthorizationAttribute(Roles = "Foo")]

装饰你的控制器