Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从控制台应用程序在ASP.NET MVC应用程序中进行身份验证_C#_Asp.net Mvc 3_Authentication_Webclient_Networkcredentials - Fatal编程技术网

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

C# 如何从控制台应用程序在ASP.NET MVC应用程序中进行身份验证,c#,asp.net-mvc-3,authentication,webclient,networkcredentials,C#,Asp.net Mvc 3,Authentication,Webclient,Networkcredentials,我有一个控制台应用程序,它向MVC应用程序发送一个XML,并接收另一个XML作为响应。它工作得很好,但我想添加授权(出于明显的原因) 以下是来自console应用程序的代码: using (var wc = new WebClient()) { return GetXmlFromBytes( wc.UploadData("URL", GetBytesFromXml(xmlToSend)) ); } public ActionResult DoSomething(

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

以下是来自console应用程序的代码:

using (var wc = new WebClient())
{
    return GetXmlFromBytes(
        wc.UploadData("URL", GetBytesFromXml(xmlToSend))
    );
}
public ActionResult DoSomething()
{
    XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream));
    var response = InsertDataFromXml(xml);
    return File(GenerateFileFromResponse, "text/xml", "result.xml");
}
下面是来自MVC应用程序的代码:

using (var wc = new WebClient())
{
    return GetXmlFromBytes(
        wc.UploadData("URL", GetBytesFromXml(xmlToSend))
    );
}
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
):

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

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

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

事实上,MVC应用程序发回的文件是登录页面的HTML

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


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

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

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication> 
  • 调用登录Web方法并从Http响应捕获身份验证Cookie
  • 将第二个Http请求上的Auth Cookie设置为DoSomething方法

  • 如果您在本地intranet上,请设置Auhentication Mode=“Windows”

    您正在混合凭证类型

    wc.Credentials = new NetworkCredential("user", "password");
    
    用于HTTP身份验证

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication> 
    
    
    
    是表单身份验证

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication> 
    
    这些是完全不同的,不兼容的。从命令行应用程序使用表单身份验证是一项挑战,您需要带着请求进入登录页面,发布用户名和密码,然后获取返回的身份验证cookie并将其附加到后续请求中。

    创建一个可用于表单身份验证的cookie。使用该类,您可以从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调用


    请参见

    Forms身份验证不是这样工作的-它依赖于HTTP Cookie。您需要Windows集成身份验证,或者您需要首先使用控制台应用程序执行“登录”。这是更改身份验证模式的一个选项,但我不能失去使用登录表单的能力。如果我把它改为HTTP身份验证,我会失去这个能力吗?(对不起,我在这个主题上真的是个“noob”!)是的,如果您切换到HTTP auth,您将失去表单auth。为这个操作创建一个自定义授权属性并检查HTTP头的凭据如何?它不是本地intranet;MVC应用程序将位于另一台服务器中。关于如何使用远程身份验证和登录表单进行简单身份验证,有什么想法吗?我知道如何将cookie设置为第2位(
    wc.Headers.Add(HttpRequestHeader.cookie,“somecookie”);
    ,对吗?),但我仍然不知道如何执行第1位。有什么想法吗?