我已经在Web api上创建了一个自定义授权属性。我的目标是检查用户是否有权直接访问Web api URL,否则将其重定向到未经授权的页面。此过程要求我到处添加[CustomAuthorize(“ modulename”)]。还有其他方法可以做到这一点?可能是拦截器?任何指导都将不胜感激。
Customised authorize attribute pseudo code snippet:
public override void OnAuthorization(HttpActionContext context){
var username = HttpContext.Current.Request.LogonUserIdentity.Name;
var accesiblemodulelistforuser = GetPermissions(username );
if (user != null)
{
if (modulename does not exist in list )
{
var response =
context.Request.CreateResponse(HttpStatusCode.Forbidden);
context.Response = response;
}
else{
return;
}
}
else{
//redirect to unauthorized page
}
}
答案 0 :(得分:1)
您的两个ASP.NET版本都没有类定义,因此我假设您继承了ActionFilterAttribute
类。只是注意到,您不是。查看修改后的版本。如果是这样,那么您可以像这样在WebApiConfig.cs
中为所有Web api操作和控制器全局注册过滤器:
public static void Register(HttpConfiguration config)
{
config.Filters.Add(new CustomAuthorize());
}
修改
完全误解了您的处境。因此,有更多信息。 您可以使用自己的全局授权过滤器:
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// user not authorized, redirect to login page
filterContext.Result = new HttpUnauthorizedResult();
return;
}
string roleName = GetModuleName(filterContext);
var user = filterContext.HttpContext.User;
// Chaeck user permissions
if (!user.IsInRole(roleName))
{
// Handle not authorized requests and redirect to error page
filterContext.Result = new RedirectResult("~/Error/NotAuthorized");
return;
}
base.OnAuthorization(filterContext);
}
string GetModuleName(AuthorizationContext filterContext)
{
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;
var actionName = filterContext.ActionDescriptor.ActionName;
return controllerName; // or actionName
}
}
您可以像这样在WebApiConfig.cs
中为所有动作和控制器全局注册过滤器:
public static void Register(HttpConfiguration config)
{
filters.Add(new CustomAuthorize());
}
或仅在特定的控制器/动作上使用。
请小心,此方法不适用于Web api,仅适用于mvc,因为Web api在AuthorizeAttribute
中拥有自己的System.Web.Http
(MVC版本位于System.Web.Mvc
中)。实现略有不同,但是您可以查找示例。因此,您将需要具有不同的属性-一个用于MVC,另一个用于WEB API。请参阅原始答案,以了解如何全局注册WEB API过滤器,或仅将其用于特定控制器。