Rejoignez Keyfactor à la RSA Conference™ 2024 | du 6 au 9 mai | En savoir plus

  • Accueil
  • Blog
  • Azure Active Directory, ADFS 3.0 et OWIN

Azure Active Directory, ADFS 3.0 et OWIN

Avec Windows AAD (Azure Active Directory), ADFS 3.0 (Active Directory Federation Service) et OWIN (Open Web Interface for .NET), vous trouverez l'identité centrale individuelle de votre entreprise, établissant des connexions entre votre entreprise et le monde entier pour des opportunités illimitées.

Actuellement, l'AAD (fournisseur d'identité et serveur d'autorisation) prend en charge les normes d'identité suivantes :

  1. OpenId Connect
  2. OAuth2
  3. SAML-P
  4. WS-Federation et WS-Trust
  5. Graph web api

ADFS 3.0 (fournisseur d'identité et serveur d'autorisation) prend en charge les normes d'identité suivantes :

  1. SAML-P
  2. WS-Federation et WS-Trust
  3. OAuth2

OWIN (spécification) et Katana (implémentation MS) fournissent des composants réutilisables pour la prise en charge de l'authentification et de l'autorisation des identités sur la base de normes industrielles, telles que OpenId Connect, OAuth2, WS-Federation et les composants OWIN de communautés tierces. Le sujet d'OWIN et de Katana est intéressant à lire si vous voulez entrer dans les détails.

Pour commencer rapidement, on peut créer une application unique (mode passif de l'interface utilisateur Web et mode actif de l'API Web) avec les composants réutilisables OWIN pour fournir les services en authentifiant et en autorisant les utilisateurs sur la base des technologies d'identité standard de l'industrie.

Les cas d'utilisation pour la fourniture de ce service dans le cadre de cette application unique sont les suivants :

1. Prise en charge de l'authentification passive et de l'autorisation basée sur les revendications dans le cadre de WS-Federation. Tous les fournisseurs d'identité compatibles avec WS-Federation, tels que AAD et ADFS, dans cette application unique.

2. Prise en charge de l'authentification et de l'autorisation passives basées sur OpenId Connect. Tous les fournisseurs d'identité conformes à OpenId Connect, tels que AAD, dans cette application unique.

3. Prise en charge de l'authentification passive et de l'autorisation pour les identités sociales individuelles, telles que Facebook, Google et Twitter, dans une seule application.

4. Prise en charge de l'authentification et de l'autorisation actives basées sur le flux d'autorisation OAuth2. Tout serveur d'autorisation conforme à OAuth2, tel que AAD et ADFS dans cette application unique.

Pour cette application unique de démarrage rapide, principalement basée sur l'article et les articles connexes via des liens, si vous souhaitez entrer dans les détails.

Comme indiqué précédemment, il est possible de construire rapidement et facilement une telle application unique en ajoutant des composants d'authentification OWIN réutilisables pour mettre en œuvre des scénarios d'authentification et d'autorisation spécifiques.

1. Créez un projet .NET en cochant les cases MVC et Web API. Laissez également les comptes d'utilisateurs individuels tels quels.

jc1

2. Installer les paquets NuGet

PM> install-package Microsoft.IdentityModel.Protocol.Extensions -pre
PM> install-package Microsoft.Owin.Security.WsFederation -pre
PM> install-package Microsoft.Owin.Security.OpenIdConnect -pre
PM> install-package Microsoft.Owin.Security.ActiveDirectory -pre

3. Ouvrez Startup.Auth.cs dans le dossier App_Start pour intégrer les composants OWIN.

public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
// Facebook social identity provider passive flow support
app.UseFacebookAuthentication(
appId: "xxx",
appSecret: "xxx");
// Azure OpenId Connect passive authentication and authorization support
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
Client_Id = "xxx",
Authority = "https://login.windows.net/xxx.onmicrosoft.com",
,
Post_Logout_Redirect_Uri = "https://localhost:xxxxx/",
Description = new Microsoft.Owin.Security.AuthenticationDescription
{
AuthenticationType = "OpenIdConnect",
Caption = "Azue OpenId Connect"
}
});
// Azure Ws-Fed Passive federated authentication support
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
MetadataAddress = "https://login.windows.net/xxx.onmicrosoft.com/FederationMetadata/2007-06/FederationMetadata.xml",
Wtrealm = "https://myapp/wsfed",
});
// Azure OAuth2 active flow support
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = "https://myapp/webapi",
Tenant = "xxx.onmicrosoft.com",
AuthenticationType = "OAuth2Bearer",
});
// ADFS OAuth2 active flow support
app.UseActiveDirectoryFederationServicesBearerAuthentication(
new ActiveDirectoryFederationServicesBearerAuthenticationOptions
{
Audience = "https://myapp/webapi",
MetadataEndpoint = "https://xxx/federationmetadata/2007-06/federationmetadata.xml"
});
}
}

CookieAuthentication et ExternalSignInCookie - Composants OWIN permettant de prendre en charge l'authentification basée sur les cookies.

FacebookAuthentication - Composant OWIN permettant de prendre en charge le flux passif du fournisseur d'identité sociale Facebook

OpenIdConnectAuthentication - Composant OWIN pour supporter l'authentification et l'autorisation passive d'Azure OpenId Connect

WsFederationAuthentication - Composant OWIN pour supporter l'authentification fédérée passive AAD Ws-Fed

WindowsAzureActiveDirectoryBearerAuthentication - Composant OWIN pour la prise en charge du code d'autorisation AAD OAuth2 pour l'octroi d'un flux actif

ActiveDirectoryFederationServicesBearerAuthentication - Composant OWIN pour la prise en charge du code d'autorisation ADFS OAuth2 pour l'octroi d'un flux actif.

4. Construire et Exécuter, puis cliquer sur Se connecter à partir de la page d'accueil.

Vous verrez 3 boutons sous "Utiliser un autre service pour se connecter"

Fédération - WsFederationAuthentication lance le flux d'authentification passive WS-Federation lorsque l'utilisateur clique sur le bouton.

Facebook - FacebookAuthentication lance le flux passif de connexion à Facebook.

OpenId Connect - OpenIdConnectAuthentication démarre l'authentification et l'autorisation passives d'Azure OpenId Connect.

jc2

5. Mettre en œuvre une interface utilisateur Web qui peut être utilisée par l'utilisateur par le biais d'un flux d'authentification passive, comme OpenId Connect, WS-Federation et Social Identity federation.

Ajouter un contrôleur en sélectionnant "MVC 5 Controller - Empty".

jc3

public class MvcValuesController : Controller {     //     // GET: /MvcValues/     public string Index()     {         if (!Request.IsAuthenticated)         {             return "You are not authenticated";         }         else         {             var ctx = Request.GetOwinContext();             ClaimsPrincipal user = ctx.Authentication.User;             return user.Identity.Name;         }     }

Une fois que vous vous êtes connecté en cliquant sur l'un des boutons de la rubrique "Utiliser un autre service pour se connecter", vous pouvez accéder à https://localhost:xxxxx/mvcvalues.

6. Mettre en œuvre l'API Web qui peut être consommée par le client natif par le biais d'un flux d'authentification active, comme OAuth2 et OpenId Connect qui est construit au-dessus d'OAuth2.

Ajouter un contrôleur en sélectionnant "Web API 2 Controller - Empty".

jc4

public class ValuesController : ApiController {     // GET api/values     [HostAuthentication("OAuth2Bearer")]     [Authorize]     public IEnumerable&lt;string&gt; Get()     {         return (((ClaimsPrincipal)Thread.CurrentPrincipal).Claims.Select(c =&gt; c.Value));         //return new string[] { "value1", "value2" };     } } 7. Build native client (for instance Console application) to test active flow by accessing <a href="https://localhost:xxxxx/api/values">https://localhost:xxxxx/api/values</a> class Program {     static void Main(string[] args)     {         AuthenticationContext ac =             new AuthenticationContext("https://login.windows.net/xxx.onmicrosoft.com");         AuthenticationResult ar =             ac.AcquireToken("https://myapp/webapi",                             "8d9a9a6a-xxxx-xxxx-xxxx-5d25df4d7ca0",                             new Uri("https://any"));         string result = string.Empty;         HttpClient httpClient = new HttpClient();         httpClient.DefaultRequestHeaders.Authorization =             new AuthenticationHeaderValue("Bearer", ar.AccessToken);         HttpResponseMessage response =             httpClient.GetAsync("https://localhost:xxxxx/api/values").Result;         if (response.IsSuccessStatusCode)         {             result = response.Content.ReadAsStringAsync().Result;         }         Console.WriteLine(result);         Console.ReadLine();     } }

7. Créer un client natif (par exemple une application console) pour tester le flux actif en accédant à https://localhost:xxxxx/api/values.

class Program
{
    static void Main(string[] args)
    {
        AuthenticationContext ac =
            new AuthenticationContext("https://login.windows.net/xxx.onmicrosoft.com");
        AuthenticationResult ar =
            ac.AcquireToken("https://myapp/webapi",
                            "8d9a9a6a-xxxx-xxxx-xxxx-5d25df4d7ca0",
                            new Uri("https://any"));

        string result = string.Empty;
        HttpClient httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", ar.AccessToken);
        HttpResponseMessage response =
            httpClient.GetAsync("https://localhost:xxxxx/api/values").Result;

        if (response.IsSuccessStatusCode)
        {
            result = response.Content.ReadAsStringAsync().Result;
        }
        Console.WriteLine(result);
        Console.ReadLine();
    }
}