2017-05-13 4 views
3

IIS 8.5にAsp MVC 5アプリがデプロイされています。 多くのクライアントからajax要求を有効にする必要があります。私はWebApiConfig.csコントローラでSOLVED:プリフライトリクエストがOKで、認証後にレスポンスにコレクタヘッダーが含まれていない

config.EnableCors(); 

で持って

サーバー側:

[EnableCors(origins: "http://localhost:59901", headers: "*", methods: "*", SupportsCredentials = true)] 
public class ItemController : Controller 

クライアント側VisualStudioを原点からクライアントを実行

$("#getItem").on("click", function (e) { 
    var myurl = "http://servername/item/details/1" 

    $.ajax({ 
     url: myurl, 
     type: "GET", 
     dataType: "JSON", 
     xhrFields: { 
      withCredentials: true 
     }, 
     contentType: "application/json; charset=utf-8", 
     error: function (jqXHR, textStatus, errorThrown) { 
      $('#result').text(jqXHR.responseText || textStatus); 
     }, 
     success: function (result) { 
      $('#result').text(result); 
     } 
    }); 
}); 

http://localhost:59901です。

1.プリフライトリクエスト/レスポンス

OPTIONS http://vrtsrv01.webdev.local/item/details/1 HTTP/1.1 
Host: vrtsrv01.webdev.local 
Connection: keep-alive 
Access-Control-Request-Method: GET 
Origin: http://localhost:59901 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 
Access-Control-Request-Headers: content-type 
Accept: */* 
Referer: http://localhost:59901/Home/Index 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,it;q=0.6,it-IT;q=0.4 

HTTP/1.1 200 OK 
Server: Microsoft-IIS/8.5 
Access-Control-Allow-Origin: http://localhost:59901 
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, MaxDataServiceVersion 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Credentials: true 
X-Powered-By: ASP.NET 
Date: Sat, 13 May 2017 15:34:54 GMT 
Content-Length: 0 

2.資格情報なしのGETリクエスト/ 401エラー応答

GET http://vrtsrv01.webdev.local/item/details/1 HTTP/1.1 
Host: vrtsrv01.webdev.local 
Connection: keep-alive 
Accept: application/json, text/javascript, */*; q=0.01 
Origin: http://localhost:59901 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 
Content-Type: application/json; charset=utf-8 
Referer: http://localhost:59901/Home/Index 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,it;q=0.6,it-IT;q=0.4 

HTTP/1.1 401 Unauthorized 
Cache-Control: private 
Content-Type: text/html 
Server: Microsoft-IIS/8.5 
X-AspNet-Version: 4.0.30319 
WWW-Authenticate: Negotiate 
WWW-Authenticate: NTLM 
X-Powered-By: ASP.NET 
Date: Sat, 13 May 2017 15:34:54 GMT 
Content-Length: 1352 
Proxy-Support: Session-Based-Authentication 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> 
<title>401 - Autorizzazione negata: accesso negato a causa di credenziali non valide.</title> 
.... 
</head> 
<body> 
<div id="header"><h1>Errore del server</h1></div> 
.... 
</body> 
</html> 
:私はシオマネキに次のように取得するAJAXリクエストを実行

3. NTLM tokeでGETリクエストN AUTH /応答CORSヘッダ許可なし

GET http://vrtsrv01.webdev.local/item/details/1 HTTP/1.1 
Host: vrtsrv01.webdev.local 
Connection: keep-alive 
Authorization: Negotiate <...NTLM TOKEN HERE ...> 
Accept: application/json, text/javascript, */*; q=0.01 
Origin: http://localhost:59901 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 
Content-Type: application/json; charset=utf-8 
Referer: http://localhost:59901/Home/Index 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,it;q=0.6,it-IT;q=0.4 


HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-IIS/8.5 
X-AspNetMvc-Version: 5.2 
X-AspNet-Version: 4.0.30319 
Persistent-Auth: true 
X-Powered-By: ASP.NET 
Date: Sat, 13 May 2017 15:34:58 GMT 
Content-Length: 8557 

{"id":1, .....} 

QUESTION CORSためMVCアプリケーションを可能にし、プリフライト要求する権利応答を見た後、応答がNTLM認証の後に得られた理由

予想されるAccess-Control-Allow-Originヘッダーが含まれていませんか? (今のところ... ...)解決しよう

呼び出されたアクションがJSONを返すコントローラのアクションでした。 これはCORSでは機能しません。 APIコントローラを作成する必要があります。既存のコントローラを使用することはできません。 これはコードの重複につながりますが、MVCとAPIの両方に対して単一のコントローラを使用するようにアプリケーション全体をリファクタリングする時間がありません

PS:今度はCORSでアクセスできるWeb APIがあります。 AJAXリクエストを実行しているクライアントとしてWord用のMicrosoft Office Webアドイン...私はこれで悪い時を過すと思う...

+0

編集内容は事実上の回答であるため、 – sideshowbarker

答えて

1

を受信できるように、ヘッダーと返信.. 。) 呼び出されたアクションはJsonを返すコントローラアクションでした。これはCORSでは機能しません。私はAPIコントローラを作成する必要があります、既存のコントローラを使用することはできません。これはコードの重複につながりますが、今はアプリケーション全体をリファクタリングして、MVCとAPIの両方に対して単一のコントローラを使用するようにはなりません。

1

私はそれがあなたを助けるかもしれないが、誰かを助けるかもしれないそれ以外の場合はNTLMCORSの両方を有効にします。

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     var corsAttr = new EnableCorsAttribute("*", "*", "*") { SupportsCredentials = true }; 
     //SupportsCredentials = true means that we will add Access-Control-Allow-Credentials to the response. 
     config.EnableCors(corsAttr); 
    } 
} 

SupportsCredentials = trueを有効

CORSたちは応答にAccess-Control-Allow-Credentialsを追加することを意味します。

他のソリューション、

global.asax.csは - 適切に別のドメインからの呼び出し側がデータを今のところ...(解決しよう

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    if (Context.Request.HttpMethod == "OPTIONS") 
    { 
     Context.Response.AddHeader("Access-Control-Allow-Origin", Context.Request.Headers["Origin"]); 
     Context.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,MaxDataServiceVersion"); 
     Context.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); 
     Context.Response.AddHeader("Access-Control-Allow-Credentials", "true"); 
     Context.Response.End(); 
    } 
} 
+0

WebApiCOnfigでは、私は単純にEnableCors()を使用して、Controllerクラスの[EnableCors()]でDataAnnotationを使用していますが、実際にはこれを受け入れて自分で受け入れることで、 SupportCredentials = trueなどの属性を持つ()また、プリフライト要求に応答しても問題ありません。正しいヘッダーが返されます。次に、私は認証を行い、成功した認証応答は必要なヘッダをすべて持っていません。私はまた、2番目のようなアプローチを試みましたが、global.asax.csにヘッダーを追加するのではなく、Web.Configに追加しました。この場合、ヘッダーは2回追加され、必要に応じて何も動作しません。 – kranz

+0

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api – Ashiquzzaman

+0

@kranzはい、これも可能です。もっと助けてください:https://msdn.microsoft.com/en-us/magazine/dn532203.aspx – Ashiquzzaman

関連する問題