【问题标题】:How to authenticate in an ASP.NET MVC application from a console application如何从控制台应用程序在 ASP.NET MVC 应用程序中进行身份验证
【发布时间】:2012-04-19 15:34:51
【问题描述】:

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

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

【问题讨论】:

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

标签: c# asp.net-mvc-3 authentication webclient networkcredentials


【解决方案1】:

您正在混合凭据类型;

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

用于 HTTP 身份验证。

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

是表单认证。

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

【讨论】:

  • 这是一个更改身份验证模式的选项 - 但我不能失去使用登录表单的能力。如果我将其更改为 HTTP 身份验证,我会失去此能力吗? (对不起,我真的是这个主题的“菜鸟”!)
  • 是的,如果您切换到 HTTP 身份验证,您将失去表单身份验证。
  • 如何为此操作创建自定义授权属性并检查凭据的 http 标头?
【解决方案2】:

您需要在使用表单身份验证时首先进行身份验证。

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

或者 如果您在本地 Intranet 上,请设置 Authentication Mode="Windows"!

【讨论】:

  • 不是本地内网; MVC 应用程序将位于另一台服务器中。关于如何进行远程和登录表单的简单身份验证有什么想法吗?
  • 我知道如何在数字 2 中设置 cookie(wc.Headers.Add(HttpRequestHeader.Cookie, "somecookie");,对吗?),但我仍然不知道如何做数字 1。有什么想法吗?
【解决方案3】:

创建一个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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多