c# - .Net Web Api - 覆盖 AuthorizationFilter

标签 c# asp.net asp.net-mvc asp.net-web-api

您好,我在 mvc 网站中有一个 web api Controller 。 我正在尝试使用 2 条规则允许访问 Controller : 用户是管理员或请求来自本地计算机;

我是 AuthorizationFilterAttribute 的新手,但我尝试编写一个限制访问的 仅限本地请求:

public class WebApiLocalRequestAuthorizationFilter : AuthorizationFilterAttribute
{

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext == null)
        {
            throw new ArgumentNullException("httpContext");
        }
        if (actionContext.Request.IsLocal())
        {
            return;
        }
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
        actionContext.Response.Content = new StringContent("Username and password are missings or invalid");
    }
}

然后我用 2 个属性装饰我的 Controller

[Authorize(Roles = "Admin")]
[WebApiLocalRequestAuthorizationFilter]
public class ContactController : ApiController
{
    public ContactModel Get(int id)
    {
        ContactsService contactsService = new ContactsService();
        return contactsService.GetContactById(id).Map<ContactModel>();
    }

}

但正如我所怀疑的,现在,为了访问 Controller ,我需要成为管理员并且应该从本地主机发出请求。我该怎么做?

亲切的问候, 塔尔休米

最佳答案

一个解决方案是创建一个继承自 AuthorizeAttribute 的类

例如像这样

public class MyAuthorizeAttribute: AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool accessAllowed = false;
        bool isInGroup = false;

        List<string> roleValues = Roles.Split(',').Select(rValue => rValue.Trim().ToUpper()).ToList();

        foreach (string role in roleValues)
        {
            isInGroup = IdentityExtensions.UserHasRole(httpContext.User.Identity, role);
            if (isInGroup)
            {
                accessAllowed = true;
                break;
            }
        }

        //add any other validation here
        //if (actionContext.Request.IsLocal()) accessAllowed = true;

        if (!accessAllowed)
        {
            //do some logging
        }

        return accessAllowed;
    }
...
}

然后你可以像这样使用它:

[MyAuthorizeAttribute(Roles = "Support,Admin")]

在上面的代码中,IdentityExtensions 检查并缓存 ActiveDirectory 角色,这也允许我们通过更改缓存来伪造具有角色的当前用户。

关于c# - .Net Web Api - 覆盖 AuthorizationFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31536785/

相关文章:

c# - If 语句跳过 for 循环中除第一个元素之外的元素。我怎样才能为其他元素找到正确的解决方案?

javascript - 为什么我的 ajax 调用无法到达我的 .NET WebMethod?

c# - TransformToAncestor 给我错误的转换

c# - 如果匹配字段位于 URL 或发布数据中,MVC 4.5 会忽略模型中的值吗?

javascript - 导出到 Excel/打印带网格线的 HTML 表格

c# - Windows服务递归无限循环,延迟执行同步任务

javascript - Telerik ASP.NET AJAX : How to get value of a data bound column, 客户端

javascript - document.getElementById 在 asp.net 中的 <div> 上失败

C# - 添加方法后显示错误

javascript - 为什么上传多个文件时HttpPostedFileBase列表为空?