代表团不工作

时间:2013-11-21 10:12:59

标签: c# asp.net-mvc authentication iis asp.net-web-api

我正在尝试让代表团使用WebClient(或HttpClient)来调用Web服务。我有一个带控制器和Web Api控制器的MVC4 Web应用程序。我在Intranet上的远程服务器上设置了应用程序,并且我在本地计算机上运行相同的应用程序,在两台计算机上使用IIS,使用基本身份验证。

Web 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 Unauthorized。如果我使用本地Web服务而不是远程Web服务,它甚至不起作用。但是,如果我使用wc.Credentials = new NetworkCredentials(user,pass,domain);手动设置wc.Credentials,则可以正常工作。

之前我使用过Windows身份验证,但它仍然拒绝工作,所以我阅读了委托,显然,如果两台计算机(它们都是)的帐户在基本身份验证方面相同,那么它应该可以正常工作,而Windows身份验证更多挑剔。

为什么它拒绝使用默认凭据,我仍然认为代理错误了吗?我已经阅读了msdn的文章,我找不到我做错了什么。

1 个答案:

答案 0 :(得分:0)

Authorize是一个允许某些用户访问操作方法的过滤器。

WindowsIdentity wi = (WindowsIdentity)User.Identity;

上述代码仍然获取登录用户的身份。冒充不是正确的方法。模拟代码要求您使用模拟用户登录,并使用句柄获取Windows标识。

MSDN Link

最好的方法是使用您提到的NetworkCredentials。