从应用程序外部调用正在使用ASP.NET MVC [Authorize]的操作

时间:2010-03-30 18:32:39

标签: asp.net asp.net-mvc security api authentication

这可能吗?

我想公开一个网址(操作),例如http://mysever/myapp/UpdateHeartbeat/

在我的MVC应用程序中,它看起来像

[Authorize]
[AcceptsVerbs(HttpVerbs.Post)]
public ActionResult UpdateHeartbeat()
{
    // update date in DB to DateTime.Now
}

现在,在我的MVC应用程序中,用户已通过FORMS身份验证登录,他们可以执行该操作到他们的内容。

我想要做的是从控制台应用程序中获取该URL并且能够进行身份验证(作为我想要构建的API的一部分) - 有没有办法可以在不删除[Authorize]的情况下执行此操作]属性并将用户名/密码作为参数添加到POST?

2 个答案:

答案 0 :(得分:2)

当然这是可能的。这是在单元测试中始终完成的。就个人而言,我使用RhinoMocksMVCContrib.TestHelper来调用我的控制器操作,无论是经过身份验证还是未经过身份验证。以下是我用来测试控制器的示例代码:

    private MockRepository _mocks = new MockRepository(); 

    public ControllerTestBase()
    {
    }

    public static T GetController<T>()
    {
        return this.GetController<T>(null);
    }

    public T GetController<T>(BPUser authenticatedUser)
    {            
        TestControllerBuilder testContBuilder = new TestControllerBuilder();

        if (authenticatedUser != null)
        {               
            var identity = _mocks.DynamicMock<IIdentity>();                

            SetupResult.For(identity.IsAuthenticated).Return(true);
            SetupResult.For(identity.Name).Return(authenticatedUser.ID.ToString());
            _mocks.Replay(identity);

            var pAttrs = new System.Collections.Hashtable();
            pAttrs["UserID"] = authenticatedUser.ID.ToString();
            pAttrs["UserName"] = authenticatedUser.UserName;
            testContBuilder.HttpContext.User = new UserPrinciple(identity, new string[] { }, pAttrs);
        }

        return testContBuilder.CreateController<T>();
    }

我的IPrinciple的实现有一些自定义的东西,但希望它是一个开始。

编辑 - 使用示例 以下是您将如何使用它:

var authenticatedUser = SomeCodeToGetMyUser();
var controller = ControllerTestBase.GetController<YourController>(authenticatedUser);
controller.UpdateHeartbeat();

答案 1 :(得分:0)

Authorize过滤器实际上从当前上下文获取用户的IPrincipal,因此这是不可能的。您需要一种替代形式的auth用于该方法。

快速谷歌搜索提供了以下可能有用的博客文章的链接:

http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute.aspx