[英]ASP.NET MVC, 'Ticket Required' Attribute
我正在尝试构建一个允许用户执行某些操作的系统,但是他们的帐户每次执行时都必须具有特定的“Ticket”。 例如,假设他们希望创建一个Product
,他们需要一个CreateProductTicket
。
我可以用一些'if'语句简单地做到这一点,当然,但我想尝试一些更强大的解决方案。 我的结构看起来像这样......
interface ITicket<T> where T : ITicketable
{
}
我的基本目标是构建一个属性,可能如下所示。
public class TicketRequiredAttribute : Attribute
{
public TicketRequiredAttribute(ITicket<T> ticket)
{
if(ticket == null)
return;
}
}
并且能够用此装饰Controller 或 Repository Actions。 所以......
[TicketRequired(CreateProductTicket)]
public ActionResult CreateProduct(Product product)
{
// ... **I am unsure how to tell if TicketRequired was true or not**
}
我不熟悉属性知道如何判断TicketRequired是否“遇到”。 任何人都可以启发我吗?
我遇到的问题是数据库查询。 我希望能够检查用户( IMembershipRepository
有一个GetUser
方法),但我不完全确定如何通过属性来做到这一点。
使用Castle.Windsor
,我将依赖注入设置为将存储库注入控制器。 我想我可以通过TicketRequired
构造函数传递IMembershipRepository
,但我感觉会变得非常混乱 - 而且非常不稳定。 有没有更合乎逻辑的方法来解决这个问题?
你快到了。 您可以在http://www.asp.net/mvc/tutorials/understanding-action-filters-cs找到更多详细信息。
我只会使用该操作的属性,因为该网站是我执行所有授权的地方。
这是一个可能的解决方案。 我没有测试过这个,但它应该可以工作。 您需要验证我重定向的方式,不确定这是否正确。
public class TicketRequiredActionFilter : ActionFilterAttribute
{
private Type _ticketType;
public TicketRequiredAttribute(Type ticketType)
{
_ticketRequired = ticketType;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
UserServices userServices = GetUserServicesViaDIContainer(); // you'll need to figure out how to implement this
string userId = filterContext.HttpContext.User.Identity.Name
bool hasTicket = userServices.HasTicket(_ticketType, (int)userId); // again, you'll need to figure out the exact implementation
if(!hasTicket)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Home" }, {"action", "NoPermission" } })
}
else
{
base.OnActionExecuting(filterContext);
}
}
}
在你的控制器中:
[TicketRequiredActionFilter(typeof(CreateProductTicket))]
public ActionResult MyMethod()
{
// do stuff as if the person is authorized and has the ticket
}
如果用户没有票证,则重定向是问题;否则,正常继续。
这听起来非常像用户角色。
你是如何处理用户会员资格的? 如果您使用内置的asp.net成员资格,则可以使用角色。 因此,每个用户在您的情况下将具有一定数量的角色,其中一个将是“CreateProductTicket”,然后您可以使用Authorize属性来装饰您的操作或控制器。 就像是:
[Authorize(Roles="CreateProductTicket")]
public ActionResult CreateProduct(Product product)
如果用户没有该角色或未经授权,则他们可以访问该操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.