这可能吗?
我想公开一个网址(操作),例如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?
答案 0 :(得分:2)
当然这是可能的。这是在单元测试中始终完成的。就个人而言,我使用RhinoMocks和MVCContrib.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用于该方法。
快速谷歌搜索提供了以下可能有用的博客文章的链接: