4

我有一個控制檯應用程序,它將XML發送給MVC應用程序並接收另一個XML作爲響應。它完美的工作,但我想添加授權(由於顯而易見的原因)。如何從控制檯應用程序在ASP.NET MVC應用程序中進行身份驗證

下面是從控制檯應用程序的代碼:

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應用程序中用戶的域是什麼。

而且,爲了確保:我確定「用戶」和「密碼」是有效的。

+0

表單身份驗證不起作用 - 它依賴於HTTP cookie。您需要Windows集成身份驗證,或者您需要先使用控制檯應用程序執行「登錄」。 – bzlm 2012-04-05 21:36:27

回答

3

您在混合憑證類型;

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

用於HTTP身份驗證。

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

是表單認證。

這些完全不同,並且不兼容。使用命令行應用程序中的表單身份驗證非常具有挑戰性,您需要使用請求轉到登錄頁面,POST用戶名和密碼,然後獲取返回的身份驗證Cookie並將其附加到後續請求。

+0

這是一個更改授權模式的選項 - 但我不能放棄使用LogOn表單的功能。如果我將其更改爲HTTP身份驗證,我是否會放棄此能力? (對不起,我真的是這個主題的「noob」!) – 2012-04-05 21:52:08

+0

是的,如果你切換到HTTP認證,你會放棄表單身份驗證。 – blowdart 2012-04-06 01:13:49

+1

如何爲此操作創建自定義的Authorize屬性並檢查憑證的http標頭? – ZippyV 2012-04-06 10:43:48

1

您需要首先進行身份驗證,因爲您使用的是Forms身份驗證。

  1. 調用登錄Web方法,並從HTTP響應
  2. 設置驗證Cookie的第二HTTP請求到DoSomething的方法

或者 設置Auhentication模式=」捕捉驗證的Cookie Windows「如果您在本地Intranet上!

+0

這不是本地內部網; MVC應用程序將在另一個服務器中。關於如何進行遠程和LogOn表單的簡單認證的任何想法? – 2012-04-05 21:53:57

+0

我知道如何設置數字2('wc.Headers.Add(HttpRequestHeader.Cookie,「somecookie」);',對不對?),但我仍然不知道如何做數字1.任何想法? – 2012-04-05 22:07:57

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

相關問題