如何从控制台应用程序中验证ASP.NET MVC应用程序

4

我有一个控制台应用程序,它发送一个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应用程序中用户的域是什么。

并且,只是为了确保:我确认“user”和“password”是有效的。


表单身份验证不是这样工作的 - 它依赖于HTTP cookie。您需要Windows集成身份验证,或者您需要首先使用控制台应用程序执行“登录”。 - bzlm
3个回答

3

您混合使用了凭据类型;

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

用于HTTP身份验证。

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication> 

是表单认证。

这两者完全不同,且不兼容。从命令行应用程序中使用表单认证是有挑战性的,您需要使用请求访问登录页面、POST用户名和密码,然后获取返回的身份验证cookie并将其附加到后续的请求。


更改身份验证模式是一种选择,但我不能失去使用登录表单的能力。如果我将其更改为HTTP身份验证,我会失去这个功能吗?(抱歉,我在这个主题上真的是一个“新手”!) - Lucas Reis
是的,如果你切换到 HTTP auth,你就失去了表单验证。 - blowdart
1
创建一个自定义的授权属性来检查此操作的HTTP标头中的凭据,如何? - ZippyV

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


1
首先,您需要进行身份验证,因为您正在使用表单身份验证。
  1. 调用Logon Web方法并捕获Http响应中的Auth Cookie
  2. 在第二个Http请求到DoSomething方法上设置Auth Cookie
或者,如果您在本地Intranet上,则设置Authentication Mode="Windows"!

这不是本地内部网络;MVC应用程序将在另一台服务器上。有什么想法可以实现远程和LogOn表单都能使用的简单身份验证吗? - Lucas Reis
我知道如何在第二个(wc.Headers.Add(HttpRequestHeader.Cookie, "somecookie");)中设置Cookie,但我仍然不知道如何做第一个。有什么想法吗? - Lucas Reis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接