Reconnexion à la session Servicestack dans une application asp.net MVC4

J’ai une application Web asp.net mvc4 qui utilise les données d’une API écrite en C # et hébergée sur une machine Linux avec Apache / mod_mono.

L’application client est écrite en C # / asp.net – Elle s’exécute sur un serveur Web différent, également Linux / Apache / mod_mono. Je ne suis pas sûr que ces détails soient importants dans ce cas, mais je me suis dit que n’importe quel contexte pourrait aider.

La question qui a conduit à celle-ci: Instance AppHostBase non définie – m’a aidé à acquérir un peu plus de compréhension de la façon dont tout cela s’imbrique.

Je pense que la bonne question que je devrais poser maintenant est la suivante: une fois que je crée une session dans Servicestack (sur le serveur API), comment puis-je me reconnecter correctement?

Suite aux réponses aux questions précédentes, j’ai utilisé ce morceau de code dans mon contrôleur d’authentification sur l’application cliente:

var authService = AppHostBase.Resolve(); authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext(); var AuthResponse = authService.Authenticate(new Auth { provider = "credentials", UserName = user.user_id, Password = user.password, RememberMe = true }); 

Cela renvoie une exception de résolution:
La dépendance de type ServiceStack.ServiceInterface.Auth.AuthService requirejse n’a pas pu être résolue.

Y a-t-il quelque chose de simple qui pourrait me manquer lorsqu’il s’agit de faire travailler le client depuis une application asp.net?

Je m’excuse si la question est trop vague et je fournirai avec plaisir plus d’informations.

Mettre à jour:
This is AuthController – Excusez-moi, j’ai essayé plusieurs choses depuis mon dernier post:

 { public partial class AuthController : BaseController { JsonServiceClient client = new ServiceStack.ServiceClient.Web.JsonServiceClient(""); // GET: /Login/ public ActionResult login() { if (Session["IsAuthenticated"] != null) { ViewData["Result"] = Session["IsAuthenticated"]; } return View(); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult login(UserModel user) { try { var authService = AppHostBase.Resolve(); authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext(); var AuthResponse = authService.Authenticate(new Auth { provider = "credentials", UserName = user.user_id, Password = user.password, RememberMe = true }); if (AuthResponse.SessionId != null) { Session["IsAuthenticated"] = true; Session["UserID"] = AuthResponse.UserName; Session["jsclient"] = client; FormsAuthentication.SetAuthCookie(user.user_id, true); return Redirect("/default"); } else { Session["IsAuthenticated"] = false; } } catch (Exception ex) { Session["IsAuthenticated"] = false; } return View(); } protected override void ExecuteCore() { throw new NotImplementedException(); } } 

}

Authentification avec une instance ServiceStack locale

Vous pouvez uniquement extraire un service ServiceStack câblé automatiquement (ou une autre dépendance IOC) d’un conteneur ServiceStack si l’instance ServiceStack est hébergée dans le même domaine d’application que MVC, c’est-à-dire:

 var authService = AppHostBase.Resolve(); authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext(); 

Bien que le code recommandé pour résoudre l’implémentation automatique d’un autre service soit:

 using (var authAservice = AppHostBase.ResolveService()) { ... } 

C’est-à-dire que les services peuvent utiliser des ressources à éliminer. Dans un service ServiceStack, vous devez base.ResolveService() utiliser base.ResolveService() .

Ainsi, si ServiceStack est hébergé dans le même domaine d’AppDomain que MVC, vous pouvez appeler le répertoire Service, comme suit:

 var authResponse = authService.Authenticate(new Auth { provider = "credentials", UserName = user.user_id, Password = user.password, RememberMe = true }); 

Authentification avec une instance Remote ServiceStack

Sinon, si c’est distant, vous devez utiliser l’un des clients du service ServiceStack C # , par exemple:

 var client = new JsonServiceClient(ServiceStackBaseUrl); var authResponse = client.Post(new Auth { provider = "credentials", UserName = user.user_id, Password = user.password, RememberMe = true }); 

Association de l’identificateur de session ServiceStack à la demande MVC d’origine

Cela configurera une session authentifiée avec ce client ServiceClient en l’attachant au cookie ss-pid (voir la documentation de la session pour plus d’informations). Vous pouvez transmettre ce cookie au navigateur d’origine appelé MVC avec:

 var response = HttpContext.Current.Response.ToResponse(); response.Cookies.AddSessionCookie( SessionFeature.PermanentSessionId, authResponse.SessionId); 

Requêtes ultérieures avec la session authentifiée

Pour vous reconnecter à la session ServiceStack authentifiée distante à partir de MVC, vous devez ensuite transmettre le cookie au service client, par exemple:

 var cookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId); var client = new JsonServiceClient(ServiceStackBaseUrl); var cookie = new Cookie(SessionFeature.PermanentSessionId, cookie.Value); client.CookieContainer.Add(cookie); 

Vous pouvez définir le domaine de cookie, globalement dans le Web.Config:

  

Ou au moment de l’exécution avec:

 cookie.Domain = "mydomain.com"; 

Les tests d’intégration ServiceStack AuthTests.cs contiennent d’ autres exemples utiles illustrant le fonctionnement de l’authentification dans ServiceStack.