13

リクエストの Authorization ヘッダーを検査するがありますが、BasicAuthenticationAttribute存在するにもかかわらず、 Authorization ヘッダーが null であると信じています。

public class BasicAuthenticationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.Request.Headers.Authorization == null)
        {
            actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
        }

        ...

調べるactionContext.Request.Headersと、リストされていることがわかりAuthorizationます:

{Connection: Keep-Alive
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-gb
Authorization: REDACTED_BUT_PRESENT==
Host: localhost:44300
Referer: https://localhost:44300/
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; .NET4.0E)
}

アップデート

完全なリクエスト ヘッダーを調べたところ、次のようになっています...最初のセクションに Authorization ヘッダーが表示されていますが、2 番目のセクションの Authorization ヘッダーは明らかに null です。

request.Headers

{Connection: Keep-Alive
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-gb
Authorization: REDACTED_BUT_PRESENT==
Host: localhost:1734
Referer: http://localhost:1734/
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; .NET4.0E)
}
    base {System.Net.Http.Headers.HttpHeaders}: {Connection: Keep-Alive
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-gb
Authorization: VXNlcjpQYXNzd29yZA==
Host: localhost:1734
Referer: http://localhost:1734/
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; .NET4.0E)
}
    Accept: {*/*}
    AcceptCharset: {}
    AcceptEncoding: {gzip, deflate}
    AcceptLanguage: {en-gb}
    Authorization: null
    CacheControl: null
    ... removed for brevity ...
    Warning: {}
4

5 に答える 5

13

これに行き詰まった場合は、次を使用してヘッダーを取得できます。

var header = request.Headers.FirstOrDefault(h => h.Key.Equals("Authorization"));

しかし、経由ではありません

var header = request.Headers.Authorization;
于 2012-10-11T16:02:27.550 に答える
9

Authorization-header に key/token のみが含まれている場合、 が適切に開始されないことに気付きrequest.Headers.Authorizationました。これは、 format のスキームも探しているためです<Scheme> <key/token>。つまりAuthorization: Token VXNlcjpQYXNzd29yZA==、 はAuthorizationnull ではなくrequest.Headers.Authorization.Scheme = "Token"request.Headers.Authorization.Parameter = "VXNlcjpQYXNzd29yZA=="

于 2016-04-28T08:31:28.070 に答える
5

基本認証属性の独自の例を投稿しました。多分これはあなたにいくつかのヒントを与えるでしょう。

私が使う:

HttpContext.Current.Request.Headers["Authorization"];

そして、ここに完全なソリューションへのリンクがあります:

http://remy.supertext.ch/2012/04/basic-http-authorization-for-web-api-in-mvc-4-beta/

于 2013-01-22T22:25:16.197 に答える
0

@finstasの回答にさらに情報を追加します。

Accept、Authorization などの明確に定義された HTTP ヘッダーが HttpRequestHeaders クラスの作成時に解析されるため、Authorization は null です。したがって、.NET がそのヘッダーに対して受け入れる形式とは異なる形式で要求が送信された場合、その特定のプロパティは null になります。

以下は、Authorization ヘッダーの解析を担当する AuthenticationHeaderValue クラスから逆コンパイルされたコードです。同様に、同じことを行うさまざまな HTTP ヘッダー用の他のクラスがあります。

これにより、トークンと値の間にスペースが必要な理由について、より多くの情報が得られることを願っています。

internal static int GetAuthenticationLength(string input, int startIndex, out object parsedValue)
{
  parsedValue = (object) null;
  if (string.IsNullOrEmpty(input) || startIndex >= input.Length)
    return 0;
  int tokenLength = HttpRuleParser.GetTokenLength(input, startIndex);
  if (tokenLength == 0)
    return 0;
  AuthenticationHeaderValue authenticationHeaderValue = new AuthenticationHeaderValue();
  authenticationHeaderValue.scheme = input.Substring(startIndex, tokenLength);
  int startIndex1 = startIndex + tokenLength;
  int whitespaceLength = HttpRuleParser.GetWhitespaceLength(input, startIndex1);
  int index = startIndex1 + whitespaceLength;
  if (index == input.Length || (int) input[index] == 44)
  {
    parsedValue = (object) authenticationHeaderValue;
    return index - startIndex;
  }
  if (whitespaceLength == 0)
    return 0;
  int startIndex2 = index;
  int parameterEndIndex = index;
  if (!AuthenticationHeaderValue.TrySkipFirstBlob(input, ref index, ref parameterEndIndex) || index < input.Length && !AuthenticationHeaderValue.TryGetParametersEndIndex(input, ref index, ref parameterEndIndex))
    return 0;
  authenticationHeaderValue.parameter = input.Substring(startIndex2, parameterEndIndex - startIndex2 + 1);
  parsedValue = (object) authenticationHeaderValue;
  return index - startIndex;
}
于 2016-05-31T06:59:00.037 に答える