的.NET Web API - 覆盖AuthorizationFilter(.Net Web Ap

2019-10-24 01:04发布

你好,我有一个MVC网站内的网页API控制器。 我想,以允许访问使用2条规则的控制:用户是管理员或请求从本地计算机来;

我是新来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点的属性

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

}

但正如我怀疑,现在,为了访问控制器我需要管理和要求应该从本地主机进行。 我该怎么做?

亲切的问候,塔尔Humy

Answer 1:

一种解决方案是创建一个从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(角色= “支持,管理员”)]

在上面的代码中,IdentityExtensions检查和高速缓存,ActiveDirectory的角色,其也允许我们假当前用户具有通过改变高速缓存的作用。



文章来源: .Net Web Api - Override AuthorizationFilter