自定义属性以筛选到访问api的身份验证组



我有一个类似的windows身份验证组列表

  • developer_group
  • hr_group
  • qa_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;
}
}

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

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会话的情况下进行检查。

最新更新