web-dev-qa-db-fra.com

API Web .NET 2 Authentification de jeton de support OWIN

J'implémente une architecture de service Web API 2 dans mon application Web .NET. Le client qui consomme les demandes est du javascript pur, pas de mvc/asp.net. J'utilise OWIN pour essayer d'activer l'authentification de jeton conformément à cet article Authentification de jeton de support OWIN avec l'exemple d'API Web . Il me semble manquer quelque chose avec l'étape d'authentification après son autorisation.

Mon identifiant ressemble à:

    [HttpPost]
    [AllowAnonymous]
    [Route("api/account/login")]
    public HttpResponseMessage Login(LoginBindingModel login)
    {
        // todo: add auth
        if (login.UserName == "[email protected]" && login.Password == "a")
        {
            var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name, login.UserName));

            AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
            var currentUtc = new SystemClock().UtcNow;
            ticket.Properties.IssuedUtc = currentUtc;
            ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));

            DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 

            return new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ObjectContent<object>(new  
                { 
                    UserName = login.UserName,
                    AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket)
                }, Configuration.Formatters.JsonFormatter)
            };
        }

        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }

Il retourne

{
   accessToken: "TsJW9rh1ZgU9CjVWZd_3a855Gmjy6vbkit4yQ8EcBNU1-pSzNA_-_iLuKP3Uw88rSUmjQ7HotkLc78ADh3UHA3o7zd2Ne2PZilG4t3KdldjjO41GEQubG2NsM3ZBHW7uZI8VMDSGEce8rYuqj1XQbZzVv90zjOs4nFngCHHeN3PowR6cDUd8yr3VBLdZnXOYjiiuCF3_XlHGgrxUogkBSQ",
   userName: "[email protected]"
}

Ensuite, j'essaie de définir l'en-tête HTTP Bearer sur d'autres requêtes dans AngularJS comme:

$http.defaults.headers.common.Bearer = response.accessToken;

à une API comme:

    [HttpGet]
    [Route("api/account/profile")]
    [Authorize]
    public HttpResponseMessage Profile()
    {
        return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ObjectContent<object>(new
            {
                UserName = User.Identity.Name
            }, Configuration.Formatters.JsonFormatter)
        };
    }

mais peu importe ce que je fais ce service est «non autorisé». Est-ce que j'ai râté quelque chose?

26
amcdnl

Résolu en définissant l'en-tête 'Authorization' avec Bearer + token comme

$http.defaults.headers.common["Authorization"] = 'Bearer ' + token.accessToken;
27
amcdnl

Vous pouvez le configurer avec votre module d'application angulaire. Le jeton d'autorisation sera donc défini comme en-tête pour chaque requête http.

var app = angular.module("app", ["ngRoute"]);
app.run(function ($http) {

     $http.defaults.headers.common.Authorization = 'Bearer ' + token.accessToken;

});
0
Shivprasad P