Bonjour à tous,
J'ai développé une application qui fait des calls API vers un vCenter.
J'ai donc un système de login avec role (Admin ou user) qui utilise l'adresse email + mot de passe de l'utilisateur.
De base, j'ai donc ces deux classes qui gère la connexion (création de session) et l'authorisation sur les différentes Action des Contrôleurs.
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 using System; using System.Collections.Generic; using System.Linq; using System.Web; using vCenterManager.Models.User; namespace vCenterManager.Website.Tools { public class SessionManager { private const string SESSION_KEY = "LoggedUser"; #region Singleton private static SessionManager _Instance; public static SessionManager Instance { get { return _Instance ?? (_Instance = new SessionManager()); } } private SessionManager() { } #endregion public UserSession Session { get { if (HttpContext.Current.Session[SESSION_KEY] == null) { HttpContext.Current.Session[SESSION_KEY] = new UserSession(); } return (UserSession)HttpContext.Current.Session[SESSION_KEY]; } set { HttpContext.Current.Session[SESSION_KEY] = value; } } public bool IsAuthenticated { get { return Session.UserID > 0; } } } }
Voici également "HomeController" sur lequel je vérifie qu'un utilisateur est connecté pour afficher la page,sinon, je redirige vers la page login.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using vCenterManager.DAL; using vCenterManager.Models.User; namespace vCenterManager.Website.Tools { public class AuthorizationManager : AuthorizeAttribute { private List<Role> _roles = new List<Role>(); public AuthorizationManager() { using (vCenterManagerContext db = new vCenterManagerContext()) { _roles = db.Roles.ToList(); } } public AuthorizationManager(params string[] MyRoles) { using (vCenterManagerContext db = new vCenterManagerContext()) { foreach (string item in MyRoles) { Role _role = db.Roles.FirstOrDefault(r => r.Name.ToUpper() == item.ToUpper()); _roles.Add(_role); } } } public override void OnAuthorization(AuthorizationContext filterContext) { UserSession _user = SessionManager.Instance.Session; if (_user.UserID <= 0) { filterContext.Result = new RedirectResult("/User/Login"); } else if (!_roles.Any(r => r == _roles.FirstOrDefault(x => x.RoleID == _user.Role.RoleID))) { filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Unauthorized); } } } }
Je souhaite maintenant ajouter la possibilité pour l'utilisateur de se connecter avec son compte Microsoft, pour cela, j'ai suivi les instructions trouvées sur cette page :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 using System.Web.Mvc; using vCenterManager.Website.Tools; namespace vCenterManager.Website.Controllers { public class HomeController : Controller { public ActionResult Index() { if (!SessionManager.Instance.IsAuthenticated) { return RedirectToAction("Login", "User"); } return View(); } } }
https://docs.microsoft.com/en-us/azu...-v2-asp-webapp
Mais cela ne fonctionne pas.
Par contre, si je change mon "HomeController" par ceci (j'enlève la vérification de session) :
Cela fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 using System.Web.Mvc; using vCenterManager.Website.Tools; namespace vCenterManager.Website.Controllers { public class HomeController : Controller { public ActionResult Index() { return View(); } } }
Je pense donc que si je fais la redirection pour afficher la page login, une session (vide) est créée et - je ne sais pas pourquoi - empêche le transmission du cookie microsoft.
Je précise qu'à la base, je ne suis pas développeur. Je me suis lancé dans ce développement parce que j'aime ça et que j'ai du temps à y consacrer.
Par contre, cette application est actuellement utilisée en production (et j'en suis plutôt satisfait )
Je ne sais pas si mon analyse est bonne et encore moins comment résoudre ce problème.
Si une bonne âme passe par ici
Un grand merci d'avance !
Bertrand
Partager