• Inicio
  • Blog
  • Azure Active Directory, ADFS 3.0 y OWIN

Azure Active Directory, ADFS 3.0 y OWIN

Con Windows AAD (Azure Active Directory), ADFS 3.0 (Active Directory Federation Service) y OWIN (Open Web Interface for .NET), encontrará su identidad central individual corporativa, estableciendo conexiones entre su empresa y el mundo entero para disfrutar de oportunidades ilimitadas.

Actualmente, AAD (proveedor de identidades y servidor de autorización) admite los siguientes estándares de identidad:

  1. OpenId Connect
  2. OAuth2
  3. SAML-P
  4. WS-Federation y WS-Trust
  5. API web de gráficos

ADFS 3.0 (proveedor de identidades y servidor de autorización) admite los siguientes estándares de identidad:

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

OWIN (especificación) y Katana (MS-implementación) proporcionan componentes reutilizables para dar soporte a la autenticación y autorización de identidades basadas en estándares de la industria, como OpenId Connect, OAuth2, WS-Federation, y componentes OWIN de comunidades de terceros. El tema de OWIN y Katana es genial para leer si quieres entrar en los detalles.

Para empezar rápidamente, se podría crear una única aplicación (Web UX de modo pasivo y Web API de modo activo) con componentes reutilizables de OWIN para prestar los servicios autenticando y autorizando a los usuarios basándose en el estándar industrial de las tecnologías de identidad.

Los casos de uso para proporcionar dicho servicio dentro de esta única aplicación son los siguientes:

1. Admite autenticación pasiva y autorización basada en reclamaciones según WS-Federation. Cualquier proveedor de identidad compatible con WS-Federation, como AAD y ADFS, en esta aplicación única.

2. Soporta autenticación pasiva y autorización basada en OpenId Connect. Cualquier proveedor de identidad compatible con OpenId Connect, como AAD en esta app única.

3. Soporta autenticación pasiva y autorización para identidades sociales individuales, como Facebook, Google y Twitter en esta única aplicación.

4. Soporta autenticación activa y autorización basada en OAuth2 authorization core grant flow. Cualquier servidor de autorización compatible con OAuth2, como AAD y ADFS en esta única app.

Para este rápido get- comenzó aplicación única, basada principalmente en el artículo y artículos relacionados a través de enlaces, si te gusta entrar en los detalles.

Como ya se ha mencionado, se podría construir rápida y fácilmente una aplicación única de este tipo conectando componentes de autenticación OWIN reutilizables para implementar escenarios específicos de autenticación y autorización.

1. Cree un proyecto .NET con MVC y Web API marcados. También deje Individual User Accounts como está.

jc1

2. Instalar paquetes 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
MP> install-package Microsoft.Owin.Security.ActiveDirectory -pre

3. Abra Startup.Auth.cs en la carpeta App_Start para conectar los componentes 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 y ExternalSignInCookie - Componentes de OWIN para la autenticación basada en cookies

FacebookAuthentication - Componente OWIN compatible con el flujo pasivo del proveedor de identidad social de Facebook

OpenIdConnectAuthentication - Componente OWIN compatible con la autenticación y autorización pasivas de Azure OpenId Connect

WsFederationAuthentication - Componente OWIN compatible con la autenticación federada pasiva AAD Ws-Fed

WindowsAzureActiveDirectoryBearerAuthentication - Componente OWIN para admitir la concesión de código de autorización AAD OAuth2 flujo activo

ActiveDirectoryFederationServicesBearerAuthentication - Componente OWIN para soportar el flujo activo de concesión de código de autorización ADFS OAuth2

4. Construir y Ejecutar, y haga clic en Iniciar sesión desde la página de inicio.

Verá 3 botones en "Utilizar otro servicio para iniciar sesión"

Federación - WsFederationAuthentication inicia el flujo de autenticación pasiva WS-Federation cuando el usuario hace clic en el botón.

Facebook - FacebookAuthentication inicia el flujo pasivo de inicio de sesión en Facebook.

OpenId Connect - OpenIdConnectAuthentication inicia la autenticación y autorización pasivas de Azure OpenId Connect.

jc2

5. Implementar Web UX que pueda ser consumida por el usuario a través del flujo de autenticación pasiva, como OpenId Connect, WS-Federation y Social Identity federation.

Añade el controlador seleccionando "Controlador MVC 5 - Vacío".

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;         }     }

Una vez que inicie sesión haciendo clic en cualquier botón de "Utilizar otro servicio para iniciar sesión", acceda a https://localhost:xxxxx/mvcvalues.

6. Ahora implementar Web API que puede ser consumido por el cliente nativo a través del flujo de autenticación activa, como OAuth2 incluyendo OpenId Connect que se construye en la parte superior de OAuth2.

Añada el controlador seleccionando "Controlador Web API 2 - Vacío".

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. Cree un cliente nativo (por ejemplo, una aplicación de consola) para probar el flujo activo accediendo a 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();
    }
}