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:
- OpenId Connect
- OAuth2
- SAML-P
- WS-Federation y WS-Trust
- API web de gráficos
ADFS 3.0 (proveedor de identidades y servidor de autorización) admite los siguientes estándares de identidad:
- SAML-P
- WS-Federation y WS-Trust
- 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á.
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.
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".
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".
public class ValuesController : ApiController { // GET api/values [HostAuthentication("OAuth2Bearer")] [Authorize] public IEnumerable<string> Get() { return (((ClaimsPrincipal)Thread.CurrentPrincipal).Claims.Select(c => 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(); } }