24 votes

Auto-hébergement de l'API Web ASP.NET avec authentification Windows

J'essaie d'utiliser l'option ASP.NET Web API Self-Host avec l'authentification Windows afin de pouvoir déterminer l'utilisateur connecté et finalement accepter ou rejeter l'utilisateur en fonction de son identité. Voici le code de mon application console :

using System;
using System.Web.Http;
using System.Web.Http.SelfHost;

namespace SelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = new HttpSelfHostConfiguration("http://myComputerName:8080");
            config.UseWindowsAuthentication = true;

            config.Routes.MapHttpRoute(
                "API Default", "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

            using (HttpSelfHostServer server = new HttpSelfHostServer(config))
            {
                server.OpenAsync().Wait();

                Console.WriteLine("Press Enter to quit.");
                Console.ReadLine();
            }
        }
    }
}

Voici le contrôleur :

[Authorize]
public class HelloController : ApiController
{
    public string Get()
    {
        // This next line throws an null reference exception if the Authorize
        // attribute is commented out.
        string userName = Request.GetUserPrincipal().Identity.Name;
        return "Hello " + userName;
    }
}

Edit - J'ai ajouté l'attribut Authorize, et le débogueur montre que le code à l'intérieur de la méthode d'action Get n'est jamais invoqué. Le code HTML suivant est renvoyé :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type></HEAD>
<BODY></BODY></HTML>

Si l'attribut Authorize est commenté, Request.GetUserPrincipal().Identity.Name lance une exception de référence nulle étant donné que Request.GetUserPrincipal() donne un résultat nul.

1voto

Eric King Points 4937

Avez-vous essayé de mettre le [Authorize] sur votre contrôleur ?

[Authorize]
public class HelloController : ApiController

1voto

PTRMark Points 21

Voici un lien vers une courte vidéo expliquant comment utiliser l'autorisation.

http://www.asp.net/web-api/videos/getting-started/authorization

Essentiellement, utiliser l'attribut [Authorize] de la classe, détecter l'erreur et renvoyer une réponse HTTP 401, puis faire en sorte que le client la détecte et aille sur la page de connexion.

1voto

Allan Elder Points 2043

Juste pour ajouter, si vous utilisez la solution de tpeczek et aussi HttpClient, vous pourriez avoir besoin de faire ceci :

        var handler = new HttpClientHandler();
        handler.UseDefaultCredentials = true;
        _httpClient = new HttpClient(handler);

0voto

Leandro Points 1015

Réponse connexe pour ceux qui en ont besoin, à propos de l'authentification de base avec jeton

En fusionnant de l'aide, des informations, des réponses et un système d'auto-autorisation que j'ai créé pour une véritable API Web, j'ai enfin pu utiliser des balises de rôles et d'attributs pour cela. Est fait pour la balise Authorization dans l'en-tête.

Invocation du serveur :

 var config = new HttpSelfHostConfiguration("http://localhost:8080");
            config.UserNamePasswordValidator = new PHVValidator();
            config.Routes.MapHttpRoute(
                "API Default", "{controller}/{id}",
                new { id = RouteParameter.Optional });

            using (HttpSelfHostServer server = new HttpSelfHostServer(config))
            {
                server.OpenAsync().Wait();
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new DominusForm());
            }

Méthode d'authentification : (codé en dur pour l'exemple uniquement, choisir l'utilisateur, le mot de passe et les rôles à partir de n'importe quel endroit)

    public class PHVValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (userName == "admin" && password == "123")
            {
                string[] rolarray = new string[] { "admin" };
               IPrincipal principal = new GenericPrincipal(new GenericIdentity(userName), rolarray);
                Thread.CurrentPrincipal = principal;
            }
        }
    }

Méthode :

[Authorize(Roles = "admin")]
public HttpResponseMessage Get()
{
     do things
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X