2010-03-30 2 views
1

Est-ce possible?Appel d'une action utilisant ASP.NET MVC [Authorize] depuis l'extérieur de l'application

Je souhaite exposer une URL (action) telle que http://mysever/myapp/UpdateHeartbeat/.

Dans mon application MVC, il ressemble

[Authorize] 
[AcceptsVerbs(HttpVerbs.Post)] 
public ActionResult UpdateHeartbeat() 
{ 
    // update date in DB to DateTime.Now 
} 

Maintenant, dans mon application MVC l'utilisateur est connecté via l'authentification des formulaires et ils peuvent exécuter cette action à coeur joie. Ce que je veux faire, c'est frapper cette URL à partir d'une application de la console et être capable de s'authentifier (dans le cadre d'une API que je voudrais construire) - est-il un moyen que je peux faire sans enlever le [ Autoriser] Attribuer et ajouter un nom d'utilisateur/mot de passe en tant que paramètres au POST?

Répondre

0

Le filtre Authorize obtient réellement l'IPrincipal de l'utilisateur à partir du contexte actuel, ce qui ne serait pas possible. Vous voudrez une autre forme d'authentification pour cette méthode.

Une recherche rapide Google fournit un lien vers le blog suivant qui peuvent être utiles:

http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute.aspx

+0

Donc, ce que je puis utiliser HTTP de base d'authentification (via https/ssl évidemment) et vérifier les informations d'identification dans la substitution ' AuthorizeCore(); 'méthode ?? – Nate

+0

Bien sûr. Vous écrivez la logique dans le override afin que vous puissiez faire tout ce que vous voulez pour que cela soit vrai ou faux. –

+0

Je sais, je suppose que ma question est la suivante: y a-t-il des implications à cela, que je ne connais peut-être pas? Est-ce sécurisé? en supposant que l'URI est HTTPs et SSL crypté, les informations d'identification sont-elles également cryptées? – Nate

2

Bien sûr cela est possible. Ceci est fait dans les tests unitaires tout le temps. Personnellement, j'utilise RhinoMocks avec MVCContrib.TestHelper pour appeler mes actions de contrôleur, authentifiées et non authentifiées. Voici un morceau d'exemple de code que j'utilise pour tester mes contrôleurs:

private MockRepository _mocks = new MockRepository(); 

    public ControllerTestBase() 
    { 
    } 

    public static T GetController<T>() 
    { 
     return this.GetController<T>(null); 
    } 

    public T GetController<T>(BPUser authenticatedUser) 
    {    
     TestControllerBuilder testContBuilder = new TestControllerBuilder(); 

     if (authenticatedUser != null) 
     {    
      var identity = _mocks.DynamicMock<IIdentity>();     

      SetupResult.For(identity.IsAuthenticated).Return(true); 
      SetupResult.For(identity.Name).Return(authenticatedUser.ID.ToString()); 
      _mocks.Replay(identity); 

      var pAttrs = new System.Collections.Hashtable(); 
      pAttrs["UserID"] = authenticatedUser.ID.ToString(); 
      pAttrs["UserName"] = authenticatedUser.UserName; 
      testContBuilder.HttpContext.User = new UserPrinciple(identity, new string[] { }, pAttrs); 
     } 

     return testContBuilder.CreateController<T>(); 
    } 

Il y a un petit truc personnalisé là-bas pour ma mise en œuvre de IPrinciple, mais nous espérons qu'il est un bon début.

Edition - Exemple d'utilisation Voici comment vous pouvez utiliser ceci:

var authenticatedUser = SomeCodeToGetMyUser(); 
var controller = ControllerTestBase.GetController<YourController>(authenticatedUser); 
controller.UpdateHeartbeat(); 
+0

Il ne s'agit pas d'un test, mais plutôt de la création d'une API à laquelle accèdent des clients non .NET, mais elle doit toujours être sécurisée. – Nate

+0

Je comprends cela. Toutefois, les mêmes principes s'appliquent, car vous demandez d'appeler une action du contrôleur qui nécessite l'authentification par formulaire. Ce code se moque de l'authentification par formulaire. Vous avez toujours la possibilité d'authentifier les utilisateurs via votre API de la manière que vous choisissez, avant de passer l'utilisateur «authentifié». – Luke

+0

Désolé, j'ai manqué la partie que vous avez mentionnée sur l'ajout du nom d'utilisateur/mot de passe dans le cadre de la publication. Si tel est le cas, je créerais personnellement une action séparée qui prend le nom d'utilisateur/mot de passe en tant que paramètres, fait l'authentification, puis redirige vers l'action UpdateHeartbeat(). – Luke

Questions connexes