WebApi自定义授权属性无法正常工作。

3

我需要使用活动目录中的一个或多个特定用户来保护我的Web API,在web.config文件中,我有以下代码:

<configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

    <section name="users" type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

  </configSections> 
  <users> 
    <add key="user" value="domain\loginname" /> 
  </users> 
  <system.web> 
    <authentication mode="Windows" /> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
  </system.web>

然后我有一个自定义的授权属性,它从上面显示的web.config部分读取用户。

public class MyAuthorizeAttribute : AuthorizeAttribute
    {

        public MyAuthorizeAttribute(params string[] userKeys)
        {
            List<string> users = new List<string>(userKeys.Length); 
            var allUsers = (NameValueCollection)ConfigurationManager.GetSection("users");
            foreach (var userKey in userKeys)
            {
                users.Add(allUsers[userKey]);
            }

            this.Users = string.Join(",", users);
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool isAuthorized = base.AuthorizeCore(httpContext);
            bool isRequestHeaderOk = false;
            return isAuthorized && isRequestHeaderOk;
        }
    }

问题在于调试器从未触发授权核心(Authorize Core),即使我将硬编码为false,浏览器中仍然显示JSON,断点也从未被触发。接下来,我使用自定义授权属性装饰我的控制器。
[MyAuthorize("user")]
        [ResponseType(typeof(tblCargo))]
        public IHttpActionResult GettblCargosByActivo()
        {
            var query = from c in db.tblCargos
                        orderby c.strCargo
                        select c;

            //var result = Newtonsoft.Json.JsonConvert.SerializeObject(query);
            //return result;

            return Ok(query);
        }

在IIS中,唯一启用的方法是Windows身份验证。

当我从另一台计算机浏览网站时,会弹出身份验证窗口,但上面显示的授权方法从未被使用。

这是一篇不错的文章,它引导我走向正确的方向(我相信) Asp.net WebApi中的自定义授权 - 一团糟?

2个回答

9
  1. 您应该在System.Web.Http中使用AuthorizeAttribute而不是System.Web.Mvc
  2. 实现IsAuthorized
protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        bool isAuthorized = base.IsAuthorized(actionContext);
        bool isRequestHeaderOk = false;
        return isAuthorized && isRequestHeaderOk;
    }

谢谢,这很有帮助,现在断点被触发了,但我有一个问题:bool isAuthorized = base.IsAuthorized(actionContext); 只有本地管理员才是true,即使我将另一个用户放在web.config的用户部分,它对他返回false。 - Luis Valencia
1
只有当用户登录到系统时,IsAuthorized 才为 true,它不取决于用户类型。如果您想要更多的检查,而不仅仅是简单的 IsAuthenticated 或 IsInRole 检查,您可以编写自己的授权属性并实现任何逻辑。 - Phong Dao

0
在我的情况下,在重构代码时,我的控制器类不再继承 ApiController。这是为了让我的过滤器生效必需的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接