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



我有一个控制台应用程序,它将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 应用程序发回的文件是登录页面的 HTML!

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

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

您正在混合凭据类型;

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

用于 HTTP 身份验证。

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

是表单身份验证。

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

在使用

表单身份验证时,首先需要进行身份验证。

  1. 调用登录 Web 方法并从 http 响应中捕获身份验证 cookie
  2. 将第二个 http 请求上的身份验证 cookie 设置为 DoSomething 方法

或 设置身份验证模式="Windows",如果你在本地内联网上!

创建一个可用于执行表单身份验证的身份验证服务。使用 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

相关内容

  • 没有找到相关文章

最新更新