我有Windows身份验证组的列表,例如
我想创建一个自定义属性,以过滤允许哪些用户组执行此类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;
}
}
答案 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。