我有一个控制台应用程序,它将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
有以下项目:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
实际上,MVC应用程序发回的文件是LogOn页面的HTML!
我该怎么做才能解决这个问题? NetworkCredentials
中是否缺少任何参数?我知道它可以使用domain
进行实例化,但我不知道MVC应用程序中的用户域是什么。
而且,只是为了确保:我确保“用户”和“密码”有效。
答案 0 :(得分:3)
您正在混合凭据类型;
wc.Credentials = new NetworkCredential("user", "password");
用于HTTP身份验证。
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
是表单身份验证。
这些完全不同,并且不兼容。从命令行应用程序使用表单身份验证具有挑战性,您需要使用请求转到登录页面,POST用户名和密码,然后获取返回的身份验证cookie并将其附加到后续请求中。
答案 1 :(得分:1)
在使用表单身份验证时,首先需要进行身份验证。
或者 如果您在本地Intranet上,请设置Auhentication Mode =“Windows”!
答案 2 :(得分:1)
创建一个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