0

クロスドメイン リクエストを実装しようとしていますが、惨めに失敗しています。Firefox、Chrome、IE10 の最新バージョンでこれを試しています。すべてのブラウザーで同じエクスペリエンスが得られます。サーバーで値を取得できるように、認証ヘッダーまたはカスタム ヘッダーのキーと値のペアのいずれかを設定しようとしています。jQuery 2.03 を使用しています。

$.ajax({
    type: "GET",
    beforeSend: function (xhr, settings)
    {
        $.extend(settings, { headers: { "Authorization": "121212" } });
    },
    url: url,
    dataType: "json",
    processData: false,
    crossDomain: true,
    success: function (msg)
    {
        alert('it works!!!');
    },
    error: function (jqXHR, textStatus, errorThrown)
    {
        alert("error dude: " + JSON.stringify(jqXHR));
    }       
});

サーバーの Authorization ヘッダーの値が null です。Authorization をカスタム キーに置き換えてみましたが、設定されません。これをajax呼び出しに追加しようとしました:

headers: { Authorization: "fooooo" },

しかし、そうすると ajax 呼び出しがサーバーに到達しなくなります。header: 属性を ajax 呼び出しに追加すると、ブレークポイントに到達しません。ただし、これを省略すると、ブレークポイントにヒットします。

ASP.Net MVC WebApi コントローラーを呼び出しています。リクエストをインターセプトし、Authorization 値を取得するためのハンドラーを作成して、WebAPI への旅行のためにユーザーを認証できるようにします。

    public class AuthorizationHeaderHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync
    (
        HttpRequestMessage request, 
        CancellationToken cancellationToken
    )
    {
        IEnumerable<string> apiKeyHeaderValues;

        if (request.Headers.TryGetValues("Authorization", out apiKeyHeaderValues))
        {
            var apiKeyHeaderValue = apiKeyHeaderValues.First();
            var user = SecurityRepository.GetUserByUserKey(apiKeyHeaderValue);

            IList<Claim> claimList = new List<Claim>();
            claimList.Add(new Claim(ClaimTypes.Name, user.Name));
            claimList.Add(new Claim(GALClaimTypes.UserKey, user.UserKey.ToString(CultureInfo.InvariantCulture)));
            claimList.Add(new Claim(GALClaimTypes.AuthenticationId, user.AuthenticationId.ToString(CultureInfo.InvariantCulture)));
            claimList.Add(new Claim(GALClaimTypes.PersonId, user.PersonId.ToString(CultureInfo.InvariantCulture)));

            claimList.Add(user.EmailAddress != null
                              ? new Claim(ClaimTypes.Email, user.EmailAddress)
                              : new Claim(ClaimTypes.Email, "unknown"));

            var identity = new ClaimsIdentity(claimList, "ApiKey");
            var principal = new ClaimsPrincipal(identity);

            Thread.CurrentPrincipal = principal;
        }

        return base.SendAsync(request, cancellationToken);
    }
}

Authorization を設定できないため、このコードは起動しません。何が欠けていますか。私のアプローチを使用しているように見える多くの投稿を読んだことがありますが、それはうまくいくようです。どんな洞察も大歓迎です。ご協力いただきありがとうございます。

4

1 に答える 1