2013-11-21 35 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