2013-11-21 69 views
2

我試圖讓委派工作使用WebClient(或HttpClient)調用webservice。我有一個帶有控制器和Web Api控制器的MVC4 Web應用程序。我在Intranet的遠程服務器上設置了應用程序,並且在本地計算機上運行同一應用程序,在兩臺計算機上使用IIS,並使用基本身份驗證。代表不能正常工作

的網絡API控制器很簡單,這是服務的代碼:

[Authorize(Users="domain\\username")] 
[HttpPost] 
[HttpGet] 
public string GetSimulationTest() 
{ 
    return "WS successfully called"; 
} 

此WS工作從我的瀏覽器或提琴手完全正常,本地和遠程。

在我家的控制器,我有以下方法:

public ActionResult TestOwnWS() 
{ 
    ContentResult res = null; 
    WindowsIdentity wi = (WindowsIdentity)User.Identity; 
    WindowsImpersonationContext ctx = null; 
    try 
    { 
     ctx = wi.Impersonate(); 
     WebClient wc = new WebClient(); 
     wc.UseDefaultCredentials = true; 
     wc.Headers.Add("Content-Type", "application/xml"); 
     res = this.Content(wc.DownloadString("linktoWS"), "application/xml"); 
    } 
    catch (Exception e) 
    { 
     Response.Write(e.Message); 
     Response.End(); 
    } 
    finally 
    { 
     ctx.Undo(); 
    } 
    return res; 
} 

這裏的問題:我上wc.DownloadString()調用401授權。如果我使用本地webservice而不是遠程webservice,它甚至不會工作。但是,如果我使用wc.Credentials = new NetworkCredentials(user,pass,domain);手動設置wc.Credentials,它就可以工作。

我以前使用Windows身份驗證,但它仍然拒絕工作,所以我閱讀委派,顯然,它應該工作正常,如果兩臺計算機上的帳戶是相同的(他們是)與基本身份驗證,而Windows身份驗證是更挑剔。

爲什麼它拒絕使用默認憑據,我仍然得到委派錯誤?我已經閱讀了msdn文章,並且找不到我做錯了什麼。

+0

我想出了一個解決方法(只要它是基本的身份驗證),即運行'wc.Headers.Add(「Authorization」,Request.Headers [「Authorization」]);',但我會愛如果有人有更好的方法來解決這個問題,因爲這個修正強制客戶端和目標站點都運行基本身份驗證。 – Tobberoth

回答

0

授權是允許某些用戶訪問操作方法的過濾器。

WindowsIdentity wi = (WindowsIdentity)User.Identity; 

上述代碼仍然獲取登錄用戶的身份。冒充不是正確的方法。模擬代碼要求您使用模擬用戶登錄,並使用句柄獲取Windows身份。

MSDN Link

最好的辦法是使用NetworkCredentials如你所說。

+0

我之所以使用模擬的原因是因爲在我在代理上找到的MSDN頁面中,它聲稱要使用基本身份驗證進行委託,您必須模擬。我不想以我發佈的方式使用NetworkCredentials,因爲我們需要能夠控制來自AD的訪問。應該使用授權來確保只有特定的服務帳戶可以訪問它,然後客戶端在使用WS時必須以這些服務帳戶登錄。對於我來說,爲什麼手動創建NetworkCredentials有效,而DefaultCredentials不能。 – Tobberoth

+0

另外需要注意的是,刪除AuthorizeAttribute不起作用。我仍然得到401未經授權。 – Tobberoth

+0

是的,授權屬性用於訪問ActionMethod的用戶或角色列表。爲了模仿,在MSDN鏈接中提到了這種方式 - http://msdn.microsoft.com/zh-cn/library/system.security.principal.windowsimpersonationcontext%28v=vs.110%29.aspx 。請參閱鏈接中的示例代碼。 – vijayst