IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Authentification d'un service Windows sur Azure


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Points : 19
    Points
    19
    Par défaut Authentification d'un service Windows sur Azure
    Bonjour,

    Je ne sais pas trop si je poste sur le bon forum, mais j'espère que vous pourrez m'aider

    Suite à une migration Office 2010 vers Office 365, je dois adapter un service windows qui actuellement se connecte au serveur Exchange de l'entreprise afin de lire les mails d'une mailbox et de faire différents traitements en fonction de l'objet du mail, destinataire, etc... J'utilise la dll Microsoft.Exchange.WebServices.2.2 pour faire ce traitement, et ça fonctionne bien sur le serveur Exchange.

    Cependant avec Office 365, il faut d'abord passer par une authentification via Azure (ce qui implique d'enregistrer l'application dans Azure Active Directory, ce que j'ai fait)

    Nom : azure1.PNG
Affichages : 253
Taille : 15,2 Ko

    J'ai également ajouté les permissions requises par l'application aux API Microsoft Graph ainsi qu'à Office 365 Exchange Online.

    Au niveau du code, il faut donc récupérer un token pour accéder aux API. J'utilise Microsoft.IdentityModel.Clients.ActiveDirectory (en version 2.28.4, je n'ai pas de droit d'admin sur mon poste donc je ne peux pas faire la MAJ )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    string resource = "https://graph.microsoft.com";
    string aadInstance = "https://login.microsoftonline.com/{0}";
    string tenant = "*******.onmicrosoft.com";
    string clientId = "2b1f76a6-*****************b3e0f";
    Uri redirectUri = new Uri("http://GTMMailWatcher");
     
    string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
     
    AuthenticationContext authentificationContext = new AuthenticationContext(authority);
    AuthenticationResult ar = authentificationContext.AcquireToken(resource, clientId, redirectUri);
    Ma première question :
    Je ne suis pas sûr de ce à quoi correspond clientId dans la méthode AcquireToken. Ici, j'ai renseigné le champ "Application ID" que j'ai récupéré dans Azure. Mais est-ce bien celui-ci que je dois utiliser ?

    Lorsque j’exécute mon code, une boîte de dialogue d'authentification s'ouvre :

    Nom : azure2.png
Affichages : 250
Taille : 19,2 Ko

    Lorsque je clique sur mon compte utilisateur, j'ai une redirection, puis le message suivant :

    Nom : azure3.png
Affichages : 300
Taille : 31,4 Ko

    Et a partir de là je suis bloqué.
    Est-ce que j'aurai oublié une étape, ou manque-t-il quelque chose pour que cela fonctionne ?

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par frearnaud Voir le message
    Suite à une migration Office 2010 vers Office 365, je dois adapter un service windows qui actuellement se connecte au serveur Exchange de l'entreprise afin de lire les mails d'une mailbox et de faire différents traitements en fonction de l'objet du mail, destinataire, etc... J'utilise la dll Microsoft.Exchange.WebServices.2.2 pour faire ce traitement, et ça fonctionne bien sur le serveur Exchange.

    Cependant avec Office 365, il faut d'abord passer par une authentification via Azure (ce qui implique d'enregistrer l'application dans Azure Active Directory, ce que j'ai fait)
    Non, tu peux te logger dans Office 365 directement, pas besoin de passer par Azure AD.

    Citation Envoyé par frearnaud Voir le message
    Au niveau du code, il faut donc récupérer un token pour accéder aux API. J'utilise Microsoft.IdentityModel.Clients.ActiveDirectory (en version 2.28.4, je n'ai pas de droit d'admin sur mon poste donc je ne peux pas faire la MAJ )
    Dans ce cas precis tu peux supprimer cette librairie car comme je l'ai ecrit plus haut, tu n'as pas besoin de passer par Azure AD pour acceder a Exchange Online. La raison est simple : pour Exchange Online il faut une licence. Cette licence n'est pas geree via Azure AD mais via le portail Office 365 (qui utilise Azure AD en background), mais il suffit de lui passer les identifiants d'une mailbox pour se connecter. C'est EWS qui va aller taper dans Azure AD pour voir si l'utilisateur existe, et s'il a une licence valide associee a son compte.

    Voici un exemple de code (implemente en tant que Singleton dans mon appli, je te laisse le soin de l'adapter a ton besoin) :
    Code C# : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    internal class ExchangeServiceSingleton
    {
    	private static ExchangeServiceSingleton _instance;
    	private readonly ExchangeService _service;
     
    	/// Creates a new instance of <see cref="ExchangeServiceSingleton"/>."
    	private ExchangeServiceSingleton()
    	{
    		// Prepare the ExchangeService object.
    		this._service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
    	}
     
    	/// <summary>
    	/// Get the singleton instance of <see cref="ExchangeServiceSingleton"/>."
    	/// </summary>
    	public static ExchangeServiceSingleton Instance => _instance ?? (_instance = new ExchangeServiceSingleton());
     
    	/// <summary>
    	/// Initialize and connect to Exchange service.
    	/// </summary>
    	/// <param name="userName">The user name used to authenticate with the Exchange Web services.</param>
    	/// <param name="password">The password used to authenticate with the Exchange Web services.</param>
    	/// <returns></returns>
    	public ExchangeService ConnectToExchangeService(string userName, string password)
    	{
    		this._service.Credentials = new WebCredentials(userName, password);
    		this._service.AutodiscoverUrl(userName, RedirectionUrlValidationCallback);
     
    		return this._service;
    	}
     
    	/// <summary>
    	/// Sends an Email and creates a copy to a specific folder.
    	/// </summary>
    	/// <param name="recipientEmail">The Email recipient.</param>
    	/// <param name="subject">The subject.</param>
    	/// <param name="bodyType">The body type.</param>
    	/// <param name="body">The Html body.</param>
    	/// <param name="copyDestinationFolderName">The copy destination folder.</param>
    	public void SendEmailMessage(string recipientEmail, string subject, BodyType bodyType, string body, WellKnownFolderName copyDestinationFolderName)
    	{
    		// Create the email message.
    		var email = new EmailMessage(this._service);
    		email.Subject = subject;
    		email.Body = new MessageBody(bodyType, body);
    		email.ToRecipients.Add(recipientEmail);
     
    		// Send the email message and save a copy.
    		email.SendAndSaveCopy(copyDestinationFolderName);
    	}
     
    	/// <summary>
    	/// Redirection validation callback.
    	/// This validates whether redirected URLs returned by Autodiscover represent an HTTPS endpoint.
    	/// This validation callback will be passed to the ExchangeService object.
    	/// We need this so that the application will trust and follow Autodiscover redirects.
    	/// The results of the Autodiscover redirect provides the EWS endpoint.
    	/// </summary>
    	/// <param name="redirectionUrl"></param>
    	/// <returns></returns>
    	private static bool RedirectionUrlValidationCallback(string redirectionUrl)
    	{
    		// The default for the validation callback is to reject the URL.
    		var result = false;
     
    		var redirectionUri = new Uri(redirectionUrl);
     
    		// Validate the contents of the redirection URL. In this simple validation
    		// callback, the redirection URL is considered valid if it is using HTTPS
    		// to encrypt the authentication credentials. 
    		if (redirectionUri.Scheme == "https")
    		{
    			result = true;
    		}
     
    		return result;
    	}
    }
    Quand tu appelles la methode ConnectToExchangeService il te suffit de passer en parametre une adresse email ainsi que le mot de passe qui va bien.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse.

    L'identification par Azure AD n'est nécessaire uniquement si on utilise MS Graph alors ?

    J'ai testé ton bout de code, mais malheureusement il ne fonctionne pas dans mon cas...

    Dans un premier temps, l'autodiscover n'a pas réussi à récupérer l'URL de serveur. Je l'ai donc forcé à https://outlook.office365.com/EWS/Exchange.asmx
    A ce moment là, lorsque j'essaye d'envoyer un mail en réutilisant la méthode que tu m'as fournie, je reçois un message d'erreur "The request failed. The remote server returned an error: (403) Forbidden."

    Dans un second temps, j'ai modifier l'adresse mail utilisée par l'autodiscover en "utilisateur@tenant.mail.onmicrosoft.com". Et pour le coup il réussi bien à résoudre l'URL https://outlook.office365.com/EWS/Exchange.asmx, mais à l'envoi du mail j'ai toujours l'erreur 403...

    Du coup je me demande si ça vaut pas le coup de tester MS Graph ?

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    MS Graph n'a strictement rien a voir avec Exchange, c'est juste une sorte de moteur de recherche qui permet de chercher des informations entre plusieurs services d'Office 365.

    Est-ce que tu as un nom de domaine correctement configure (y compris les redirections MX et autres) qui pointe vers ton compte Office 365 ?
    Est-ce que le compte email que tu utilises dispose bien d'une licence valide ? Quelles sont ses permissions (de quel groupe fait-il partie) ?

    Seconde question, dans l'exception 403, tu dois avoir plus d'infos. Donne-les nous ici pour qu'on y voit plus clair. Il y a peut-etre un souci de configuration (permissions, licence, parametrage, etc.).

    Enfin, ce bout de code est actuellement utilise par mes equipes sur plusieurs applications en production et notre serveur Exchange est dans Office 365.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    Après avoir vu avec des admins, il s'agissait bien d'un problème de config.
    Tout fonctionne parfaitement, merci pour tes indications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/02/2016, 17h04
  2. [Débutant] Service Windows sous Azure
    Par redcurve dans le forum Microsoft Azure
    Réponses: 0
    Dernier message: 03/03/2015, 00h59
  3. Lancement de service windows sur machine virtuelle
    Par Sieur_Blabla dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/10/2014, 10h34
  4. authentification d'un service windows
    Par Nixar dans le forum Windows
    Réponses: 5
    Dernier message: 22/03/2006, 11h05
  5. Question sur les services windows
    Par bilb0t dans le forum Windows
    Réponses: 8
    Dernier message: 09/11/2005, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo