Avez-vous une idée de la façon dont je peux utiliser un access_token généré par l'api web asp.net par défaut 2 OAuth 2 mécanisme d'autorisation, dans les paramètres url. Actuellement, je suis en mesure d'autoriser avec succès en envoyant une demande avec en-tête d'autorisation comme celle-ci:
Accept: application/json
Content-Type: application/json
Authorization: Bearer pADKsjwMv927u...
Ce que je veux, c'est activer l'autorisation via le paramètre URL comme ceci:
https://www.domain.com/api/MyController?access_token=pADKsjwMv927u...
Eh bien - je suis d'accord que l'en-tête est une bien meilleure alternative - mais il y a bien sûr des situations où la chaîne de requête est nécessaire. La spécification OAuth2 le définit également.
Quoi qu'il en soit - cette fonctionnalité est intégrée au middleware Katana OAuth2:
public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
readonly string _name;
public QueryStringOAuthBearerProvider(string name)
{
_name = name;
}
public override Task RequestToken(OAuthRequestTokenContext context)
{
var value = context.Request.Query.Get(_name);
if (!string.IsNullOrEmpty(value))
{
context.Token = value;
}
return Task.FromResult<object>(null);
}
}
Puis:
var options = new JwtBearerAuthenticationOptions
{
AllowedAudiences = new[] { audience },
IssuerSecurityTokenProviders = new[]
{
new SymmetricKeyIssuerSecurityTokenProvider(
issuer,
signingKey)
},
Provider = new QueryStringOAuthBearerProvider(“access_token”)
};
Alors, allez sur Global.asax et ajoutez cette méthode:
void Application_BeginRequest(object sender, EventArgs e)
{
if (ReferenceEquals(null, HttpContext.Current.Request.Headers["Authorization"]))
{
var token = HttpContext.Current.Request.Params["access_token"];
if (!String.IsNullOrEmpty(token))
{
HttpContext.Current.Request.Headers.Add("Authorization", "Bearer " + token);
}
}
}
MISE À JOUR: Consultez la réponse @leastprivilege. Une bien meilleure solution.
C'est une idée terrible car le jeton n'est pas protégé dans la chaîne de requête. Il est crypté dans l'en-tête avec SSL.