C# WebApi自定义授权属性不起作用
我需要从active directory保护一个或多个特定用户的web api,在web.config中,我有以下代码:C# WebApi自定义授权属性不起作用,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我需要从active directory保护一个或多个特定用户的web api,在web.config中,我有以下代码: <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, Public
<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>
在IIS中,唯一启用的方法是Windows身份验证
当我从另一台计算机浏览到该站点时,我会看到“身份验证”窗口,但上面显示的authoze方法从未被点击
这是一个很好的帖子,引导我走向正确的方向(我相信)
System.Web.Http
中使用AuthorizeAttribute
,而不是System.Web.Mvc
在我的例子中,在重构时,我的控制器类不再扩展ApiController。这是我的筛选器启动所必需的。谢谢您的帮助,现在点击了断点,但是我有一个问题,bool isAuthorized=base.isAuthorized(actionContext);仅在计算机的本地管理员处为true,即使我将另一个用户放在web.config users部分,它也会为HIMIAuthorized返回false。仅当用户登录到系统时为true,它不取决于用户的类型。如果您想要的不仅仅是简单的IsAuthenticated或IsInRole检查,那么您可以编写自己的授权属性并实现您想要的任何逻辑
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;
}
}
[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);
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
bool isAuthorized = base.IsAuthorized(actionContext);
bool isRequestHeaderOk = false;
return isAuthorized && isRequestHeaderOk;
}