ASP.NET l'API Web de l'Authentification de Base de l'Autorisation d'en-Tête
J'ai un BasicAuthenticationAttribute
qui inspecte l'Autorisation d'en-tête dans la demande, mais malgré elle, elle croit toujours que l'Autorisation d'en-tête est nulle:
public class BasicAuthenticationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.Request.Headers.Authorization == null)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
...
Si je inspecter actionContext.Request.Headers
je peux voir Authorization
répertoriés:
{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)
}
Mise à jour
Je viens d'inspecter la demande complète des en-têtes et ils ont l'air comme ça... je peux voir un en-tête d'Autorisation dans la première section, mais l'en-tête d'Autorisation dans la deuxième section est clairement nul.
demande.Les en-têtes de
{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: {}
êtes-vous en essayant l'authentification de Base.
oui - je suis réglage de l'Autorisation d'en-tête et de l'inspection à l'aide de mon Action de Filtre.
J'ai fait un gestionnaire de Message et il semble bien fonctionner. Je vais essayer avec l'action du filtre. Pouvez-vous vérifier si cela permet de gist.github.com/3872727 -Gestionnaire ,gist.github.com/3872715 - Test Unitaire
C'est essentiellement le même pour moi - je peux voir l'en-tête d'Autorisation comme posté, mais dans le Gestionnaire de Messages, il pense que
oui - je suis réglage de l'Autorisation d'en-tête et de l'inspection à l'aide de mon Action de Filtre.
J'ai fait un gestionnaire de Message et il semble bien fonctionner. Je vais essayer avec l'action du filtre. Pouvez-vous vérifier si cela permet de gist.github.com/3872727 -Gestionnaire ,gist.github.com/3872715 - Test Unitaire
C'est essentiellement le même pour moi - je peux voir l'en-tête d'Autorisation comme posté, mais dans le Gestionnaire de Messages, il pense que
request.Headers.Authorization
est null. Permettez-moi d'inspecter les en-têtes générés par les tests unitaires et voir si elle est différente.OriginalL'auteur Fenton | 2012-10-11
Vous devez vous connecter pour publier un commentaire.
Si vous êtes coincé sur ce, vous pouvez obtenir l'en-tête à l'aide de:
Mais pas via
Je crois parce que c'est une Clé/Valeur de la structure comme un dictionnaire.
Sérieusement, pourquoi est-ce si? Une bibliothèque que je suis à l'aide de contrôles de l'Autorisation de propriété, sans les en-têtes de la collection...
dans Web API2 Contrôleur, nous pouvons à l'aide de la Demande.Les en-têtes.D'autorisation.Paramètre donnera le réel jeton.
OriginalL'auteur Fenton
J'ai remarqué moi-même que si l'Autorisation d'en-tête ne contient que la clé/jeton, le
request.Headers.Authorization
ne serait pas lancé correctement, car il est à la recherche pour un régime aussi bien dans le format<Scheme> <key/token>
, c'est à direAuthorization: Token VXNlcjpQYXNzd29yZA==
, puis leAuthorization
ne pas être null plus et contiennentrequest.Headers.Authorization.Scheme = "Token"
etrequest.Headers.Authorization.Parameter = "VXNlcjpQYXNzd29yZA=="
OriginalL'auteur finstas
J'ai posté mon propre exemple de l'Authentification de Base de l'Attribut. Peut-être que cela vous donne quelques conseils.
J'utilise:
Et voici le lien vers la solution complète:
http://remy.supertext.ch/2012/04/basic-http-authorization-for-web-api-in-mvc-4-beta/
OriginalL'auteur Remy
Ajouter plus d'informations à @finstas de réponse.
Autorisation est nulle car bien définies en-têtes HTTP, comme Accepter, d'Autorisation et de nombreux autres sont analysés lors de la création de la HttpRequestHeaders classe. Par conséquent, si la demande vient avec un format différent de ce que .NET accepte pour que l'en-tête de cette propriété aura la valeur null.
Ci-dessous est la décompilation du code de la AuthenticationHeaderValue classe responsable de l'analyse de l'en-tête d'Autorisation. De même, il existe d'autres classes pour les différents en-têtes HTTP qui font la même chose.
Espère que cela met plus d'infos sur pourquoi il doit y avoir un espace entre le symbolique et la valeur.
OriginalL'auteur vignesh