如何在global.asax中调用控制器方法?

时间:2014-02-23 08:18:36

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我想在Global.asax中调用控制器方法。代码如下。

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {      
            //here we can subscribe user to a role via Roles.AddUserToRole()
        }
    }

此事件位于global.asax中。我想调用从数据库返回用户权限的控制器方法。在这之后如何调用控制器方法我将在会话和控制器构造函数中保存用户权限?代码如下。

public class AccountController : Controller
{

    private readonly ISecurityService securityService;

    public AccountController(ISecurityService securityService)
    {
        this.securityService = securityService;
    }
}

请指导我。

2 个答案:

答案 0 :(得分:2)

您可以使用自定义AuthorizeAttribute处理此问题。这允许您将属性放在要求身份验证成功的任何控制器/方法的顶部以便调用。这使您可以覆盖AuthorizeCore,然后可以使用它来执行您要执行的任何自定义授权。您还可以使用此方法将任何其他信息保存到会话中。

例如:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // do your own athorization stuff here
    }
}

然后,您可以使用您的属性装饰需要使用此授权的控制器:

[CustomAuthorize]
public class AccountController : Controller
{
}

或使用基本控制器:

[CustomAuthorize]
public class BaseAuthController : Controller
{
}

public class AccountController : BaseAuthController
{
}

答案 1 :(得分:1)

我通过我自己在global.asax中调用服务方法来解决这个问题,解决下面的依赖问题是上述问题的解决方案。

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {
            IUnityContainer container = GetUnityContainer();
            ISecurityService securityService = container.Resolve<SecurityService>();
            var list = securityService.GetUserRolesandPermissions("1");
        }
    }

谢谢大家。