如何从控制台应用程序在ASP.NET MVC应用程序中进行身份validation

我有一个控制台应用程序,它将XML发送到MVC应用程序并接收另一个XML作为响应。 它工作得很好,但我想添加授权(出于显而易见的原因)。

以下是控制台应用程序的代码:

using (var wc = new WebClient()) { return GetXmlFromBytes( wc.UploadData("URL", GetBytesFromXml(xmlToSend)) ); } 

这是来自MVC应用程序的代码:

 public ActionResult DoSomething() { XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream)); var response = InsertDataFromXml(xml); return File(GenerateFileFromResponse, "text/xml", "result.xml"); } 

它有效。 因此,为了实现授权,我添加了以下代码:

控制台(添加了wc.Credentials ):

 using (var wc = new WebClient()) { wc.Credentials = new NetworkCredential("user", "password"); return GetXmlFromBytes( wc.UploadData("URL", GetBytesFromXml(xmlToSend)) ); } 

MVC应用程序(添加[Authorize] ):

 [Authorize] public ActionResult DoSomething() { XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream)); var response = InsertDataFromXml(xml); return File(GenerateFileFromResponse, "text/xml", "result.xml"); } 

它不起作用。 我不知道是否需要此信息来解决此问题,但我的web.config有以下项目:

    

实际上,MVC应用程序发回的文件是LogOn页面的HTML!

我该怎么做才能解决这个问题? NetworkCredentials是否缺少任何参数? 我知道它可以用domain实例化,但我不知道MVC应用程序中用户的域是什么。

而且,只是为了确保:我保证“用户”和“密码”是有效的。

你正在混合凭证类型;

 wc.Credentials = new NetworkCredential("user", "password"); 

用于HTTP身份validation。

    

是表单身份validation。

这些完全不同,不兼容。 从命令行应用程序使用表单身份validation具有挑战性,您需要使用请求转到登录页面,POST用户名和密码,然后获取返回的身份validationcookie并将其附加到后续请求。

在使用表单身份validation时,首先需要进行身份validation。

  1. 调用Logon Web方法并从Http响应中捕获Auth Cookie
  2. 将第二个Http请求上的Auth Cookie设置为DoSomething方法

或者,如果您在本地Intranet上,请设置身份validation模式=“Windows”!

创建可用于执行表单身份validation的AuthenticationService。 使用ClientBaseExtensions类,您可以从WCF服务客户端获取cookie。 将此cookie注入另一个调用…

 String cookies = null; var auth = new AuthenticationServiceClient(); using (new OperationContextScope(auth.InnerChannel)) { auth.Login("user", "password", null, true); cookies = auth.GetIncomingCookies(); } 

现在将cookie数据注入您的数据服务或HTTP调用。

请参阅http://mytoolkit.codeplex.com/wikipage?title=ClientBaseExtensions