ASP.NET l'API Web de l'Auto-organisation avec l'Authentification Windows
Je suis en train d'utiliser l'ASP.NET l'API Web de l'Auto-Hôte de l'option avec l'authentification Windows afin que je puisse déterminer l'utilisateur connecté et en fin de compte accepter ou de rejeter l'utilisateur sur la base de leur identité. Voici ma console le code de l'application:
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();
}
}
}
}
Ici est 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é de l'Autoriser l'attribut, et le débogueur affiche que le code à l'intérieur de l'Obtenir par les méthodes d'action n'est jamais invoquée. 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'Autoriser attribut est commenté, Request.GetUserPrincipal().Identity.Name
lève une exception de type référence nulle depuis Request.GetUserPrincipal()
donne null.
- Vous avez juste besoin de mettre un point de rupture et de savoir qui de la propriété ci-dessus est nulle... est "ControllerContext" null? ou "Demande" ou "GetUserPrincipal()" ou "Identité"?
- Ouais, ce bien est de générer de la valeur null ref?
- le
Request.GetUserPrincipal()
est null. J'ai ajouté le[Authorize]
attribut comme suggéré par Eric le Roi et puis je viens de recevoir un os à nu de la page HTML avec le contenu entre deux balises de corps et il ne s'exécute le code à l'intérieur de monGet
méthode d'action dans la classe du contrôleur. - Avez-vous jamais résoudre ce que c'est?
- merci pour l'ajout de la générosité! Je n'ai pas résolu ce un.
- J'ai seulement besoin de selfhost pour les tests d'intégration, donc j'ai piraté le contourner en utilisant l'authentification de base spécialement à cet effet (tout fonctionne dans IIS).
- Salut, un jour sur cette? J'ai le même cas d'utilisation pour mon application. Est-ce résolu?je vous remercie.
- cool, juste paramètre HttpSelfHostConfiguration.ClientCredentialType pour windows fonctionne - probablement question suis fixé.
Vous devez vous connecter pour publier un commentaire.
J'ai touché à cette question et la seule solution que j'ai est venu avec est de fournir dédié HttpSelfHostedConfiguration:
Pour l'utiliser, il suffit de changer une seule ligne (vous n'avez pas besoin de UseWindowsAuthentication plus):
Le seul problème avec cette approche est que l'authentification est requis pour chaque demande faite à un serveur qui utilise cette configuration.
que j'ai hébergé "API Web", dans service de windows, et c'est ce que j'ai fait à l'appui de l'authentification windows (essentiellement basé sur la question ci-dessus, les réponses, certains articles connexes - je suis tout à consolider comme il peut être utile pour les autres)
@Serveur HTTP (web api):
Set (référence: http://msdn.microsoft.com/en-us/library/system.web.http.selfhost.httpselfhostconfiguration.clientcredentialtype(v=vs. 118).aspx),
@Client:
Et puis, comme Allan mentionnés (ci-dessus) ensemble UseDefaultCredentials de vrai.
À L'Aide De HttpClient:
À l'aide de WebClient (référence: http://msdn.microsoft.com/en-us/library/system.net.webclient.usedefaultcredentials.aspx )
ensemble webclient est usedefaultcrednetials à 'true'.
En Ce Qui Concerne Meilleur!
Je suis un peu tard pour cela. Toutefois, si vous utilisez Owin à l'autonomie de l'hôte et le besoin de l'authentification windows. Dans de démarrage de votre classe, vous pouvez ajouter le suivant.
Êtes-vous sûr que vous obtenez par le biais de la partie authentification? Vous pouvez utiliser fiddler pour vérifier si les demandes sont passer à travers ou si le serveur répond toujours avec 401 non autorisé (puisque vous êtes à l'aide de l'authentification).
Vous pouvez également essayer de mettre en place votre propre personnalisé
AuthorizeAttribute
et de mettre des points d'arrêt dans pour s'assurer qu'il est touché (vous aurez envie de remplacer laOnAuthorization
méthode et voir si cela se fait frapper).Aussi, assurez-vous que vous utilisez le
Authorize
attribut deSystem.Web.Http
, et pas deSystem.Web.Mvc
. Voir ici pourquoi.OnAuthorization
méthode. Vous avez utilisé le[MyAuth]
tag au lieu de[Authorize]
, je suppose.MessageHandler
pour ajouter la bonne défi en-têtes de la réponse... mais je ne suis pas sûr que ce serait suffisant (les mécanismes d'authentification comporte plusieurs étapes, et vous ne devriez pas avoir à réinventer la roue ici).Avez-vous essayé de mettre le
[Autoriser]
attribut sur votre contrôleur?Voici un lien vers une courte vidéo expliquant comment utiliser l'autorisation.
http://www.asp.net/web-api/videos/getting-started/authorization
En substance, l'utilisation de la [Autoriser] l'attribut de la classe, de la capture de l'erreur et de retour HTTP de la réponse 401 et ensuite le client de détecter et d'aller à la page de connexion
Juste à ajouter, si vous êtes en utilisant tpeczek solution et également à l'aide de HttpClient, vous pourriez avoir besoin pour ce faire:
Similaire à tpeczek's réponse, mais mis à jour pour refléter HTTPS utilisation. tpeczek's réponse ne fonctionne pas pour HTTPS parce que l'appel à
base.OnConfigureBinding(httpBinding);
avec HTTPS écrase les modifications. En outre, vous ne pouvez pas utiliserhttpBinding.Security.Mode = HttpBindingSecurityMode.TransportCredentialOnly;
avec le protocole HTTPS.Utiliser un HttpSelfHostConfiguration:
Ensuite, vous pouvez faire
ou
pour obtenir une configuration à passer dans
new HttpSelfHostServer(config)
Liées réponse pour qui en ont besoin, à propos de l'authentification basique avec un jeton
La fusion de l'aide, des infos, des réponses et un auto-auth système que j'ai fait pour une vraie API Web, j'ai enfin pu utiliser les rôles et les attributs des balises pour cela. Est faite pour l'Autorisation dans la balise d'en-tête.
Serveur invocation:
Auth Méthode: (codé en dur pour les anciens. seulement, choisissez user, pass et les rôles de n'importe où)
Méthode: