自定义属性以过滤到身份验证组以访问api

时间:2018-12-19 17:24:14

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

我有Windows身份验证组的列表,例如

  • developer_group
  • hr_group
  • qa_group
  • db_group

我想创建一个自定义属性,以过滤允许哪些用户组执行此类API。我不确定是否可以这样做。

 [MYcustomattribute(groups = hr_group,qa_group)]
 public ActionResult About()
 {
    ViewBag.Message = "Your application description page.";

    return View();
 }

首先,我需要获取用户以及该用户的所有组。如何检查该用户属于该组并允许该用户访问API?

控制器:

namespace AuthenticationSample.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }
        [MYcustomattribute(groups = hr_group,qa_group)]
        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

过滤器类:

public class MYcustomattribute : ActionFilterAttribute

{

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        //You may fetch data from database here 
        filterContext.Controller.ViewBag.GreetMesssage = "Execute my filter";
        base.OnResultExecuting(filterContext);
    }


    public static bool IsMemberOfGroup(string userName, string groupName)
    {
        if (string.IsNullOrEmpty(userName))
            return false;

        using (var context = new PrincipalContext(ContextType.Domain))
        {
            using (var user = UserPrincipal.FindByIdentity(context, userName))
            {
                if (user != null)
                {
                    var groups = user.GetGroups();
                    foreach (var group in groups)
                    {
                        if (group.Name.Trim().ToUpper() == groupName.Trim().ToUpper())
                            return true;
                    }
                }
            }
        }

        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以修改下面的代码以实现问题中描述的结构。

public class MyCustomAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.Session != null)
            {
                var request = context.HttpContext.Session["User"] as User;
                if (request != null)
                {
                    if (request.UserGroups.Contains("some_group"))
                    {
                        //do something
                    }

                    if (request.UserGroups.Contains(""))
                    {
                        // do something else
                    }

                }
                else
                {
                    //No group info, kinda BadRequest!
                    filterContext.Result = new RedirectResult("/index.html");
                }
            }
        }

其背后的想法是,您可以拒绝来自不需要的一群人的任何请求,将它们重定向到某个页面或返回错误的请求类型的消息。另外,您可以尝试如下所示修改用户类别,以轻松获取组信息(只是一个建议)。希望对您有帮助。

public class User
{
    //....
    //....
    //User Attributes
    public List<string> UserGroups { get; set; }
}

最后,您可以按如下所示应用此属性。

    [MyCustom]
    public IActionResult YourControllerMethod()
    {
        return View();
    }

编辑:要从HttpClient获取对象,您可以在出现空HttpContext会话的情况下签出this