代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

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

  •  1
  • Nate CSS Guy  · 技术社区  · 15 年前

    这有可能吗?

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

    在我的MVC应用程序中

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

    现在,在我的MVC应用程序中,用户已经通过表单身份验证登录,他们可以对自己的hearts内容执行该操作。

    我想做的是,从控制台应用程序中点击该URL,并能够进行身份验证(作为我希望构建的API的一部分)--有没有一种方法可以做到这一点,而不删除[authorize]属性并将用户名/密码作为参数添加到日志中?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Bradley Mountford    15 年前

    authorize过滤器实际上从当前上下文中获取用户的iprincipal,因此这是不可能的。您将需要该方法的另一种形式的身份验证。

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

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

        2
  •  2
  •   Luke    15 年前

    当然可以。这是在单元测试中一直进行的。我个人用 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();