2010-03-30 49 views
1

這可能嗎?從應用程序外調用正在使用ASP.NET MVC [Authorize]的動作

我想公開一個URL(動作),如http://mysever/myapp/UpdateHeartbeat/

在我的MVC應用程序,它看起來像

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

現在,在我的MVC應用程序的用戶通過窗體身份驗證登錄,他們可以執行行動,他們的心的內容。

我想做什麼,是從控制檯應用程序中擊中URL,並且能夠進行身份驗證(作爲我希望構建的API的一部分) - 有沒有一種方法可以在不移除[授權]屬性並將用戶名/密碼作爲參數添加到POST?

回答

0

Authorize過濾器實際上從當前上下文獲取用戶的IPrincipal,所以這是不可能的。您需要爲該方法提供另一種形式的身份驗證。

快速谷歌搜索提供了一個鏈接到下面的博客貼子,可能是有用的:

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

+0

所以,我會再使用基本的HTTP認證(通過HTTPS/SSL明顯),並檢查在覆蓋這些憑據' AuthorizeCore();'方法?? – Nate 2010-03-30 19:42:15

+0

當然。你正在編寫覆蓋的邏輯,所以你可以做任何你想讓它返回true或false的東西。 – 2010-03-30 20:05:53

+0

我知道,我想我的問題是,這樣做有什麼意義,我可能不知道?它安全嗎?假設URI是HTTPs和ssl加密的,那麼憑證是否也加密? – Nate 2010-03-30 20:11:39

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(); 
+0

這不是用於測試,這是爲了構建一個將被非.NET客戶端訪問的API,但它仍然需要安全。 – Nate 2010-03-30 19:54:47

+0

我明白這一點。但是,相同的原則適用於您要求調用需要表單身份驗證的控制器操作。此代碼嘲笑表單身份驗證。您仍然有能力通過您的API以任何方式對用戶進行身份驗證,然後傳入「已通過身份驗證」的用戶身份。 – Luke 2010-03-30 20:00:38

+0

對不起,我錯過了你提到的有關添加用戶名/密碼作爲帖子一部分的部分。如果是這種情況,我會親自創建一個單獨的操作,將用戶名/密碼作爲參數,進行身份驗證,然後重定向到UpdateHeartbeat()操作。 – Luke 2010-03-30 20:05:49

相關問題