Mit Windows AAD (Azure Active Directory), ADFS 3.0 (Active Directory Federation Service) und OWIN (Open Web Interface for .NET) finden Sie Ihre unternehmensindividuelle Kernidentität und schaffen Verbindungen zwischen Ihrem Unternehmen und der ganzen Welt für unbegrenzte Möglichkeiten.
Derzeit unterstützt AAD (Identity Provider und Authorization Server) die folgenden Identitätsstandards:
- OpenId Verbinden
- OAuth2
- SAML-P
- WS-Föderation und WS-Trust
- Graph-Web-Api
ADFS 3.0 (Identitätsanbieter und Autorisierungsserver) unterstützt die folgenden Identitätsstandards:
- SAML-P
- WS-Föderation und WS-Trust
- OAuth2
OWIN (Spezifikation) und Katana (MS-Implementierung) bieten wiederverwendbare Komponenten zur Unterstützung der Identitätsauthentifizierung und -autorisierung auf der Grundlage von Industriestandards wie OpenId Connect, OAuth2, WS-Federation und OWIN-Komponenten von Drittanbietergemeinschaften. Das Thema OWIN und Katana ist sehr lesenswert, wenn Sie sich mit den Details befassen möchten.
Für einen schnellen Einstieg könnte man eine einzige Anwendung (Web-UX im passiven Modus und Web-API im aktiven Modus) mit wiederverwendbaren OWIN-Komponenten für die Bereitstellung der Dienste durch Authentifizierung und Autorisierung der Benutzer auf der Grundlage des Industriestandards der Identitätstechnologien erstellen.
Die Anwendungsfälle für die Bereitstellung eines solchen Dienstes innerhalb dieser einzigen Anwendung sind wie folgt:
1. Unterstützung von passiver Authentifizierung und anspruchsbezogener Autorisierung auf der Grundlage von WS-Federation. Alle WS-Federation-kompatiblen Identitätsanbieter wie AAD und ADFS in dieser einzigen App.
2. Unterstützung von passiver Authentifizierung und Autorisierung basierend auf OpenId Connect. Jeder OpenId Connect konforme Identitätsanbieter, wie z.B. AAD in dieser einzigen App.
3. Unterstützung der passiven Authentifizierung und Autorisierung für einzelne soziale Identitäten wie Facebook, Google und Twitter in dieser einen App.
4. Unterstützung aktiver Authentifizierung und Autorisierung auf der Grundlage des OAuth2-Autorisierungskerns Grant Flow. Jeder OAuth2-konforme Autorisierungsserver, wie AAD und ADFS, in dieser einzigen App.
Für diesen schnellen Einstieg in die Einzelbewerbung, in erster Linie auf der Grundlage von Artikeln und verwandten Artikeln über Links, wenn Sie in die Details gehen möchten.
Wie bereits erwähnt, kann man schnell und einfach eine solche Einzelanwendung erstellen, indem man wiederverwendbare OWIN-Authentifizierungskomponenten einfügt, um spezifische Authentifizierungs- und Autorisierungsszenarien zu implementieren.
1. Erstellen Sie ein .NET-Projekt mit den Optionen MVC und Web API. Lassen Sie auch Individuelle Benutzerkonten so wie sie sind.
2. NuGet-Pakete installieren
PM> install-package Microsoft.IdentityModel.Protocol.Extensions -pre PM> install-package Microsoft.Owin.Security.WsFederation -pre PM> install-Paket Microsoft.Owin.Security.OpenIdConnect -pre PM> install-package Microsoft.Owin.Security.ActiveDirectory -pre
3. Öffnen Sie die Datei Startup.Auth.cs im Ordner App_Start, um die OWIN-Komponenten einzubinden.
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 und ExternalSignInCookie - OWIN-Komponenten zur Unterstützung der Cookie-basierten Authentifizierung
FacebookAuthentication - OWIN-Komponente zur Unterstützung des passiven Flusses von Facebooks Social Identity Provider
OpenIdConnectAuthentication - OWIN Komponente zur Unterstützung der passiven Authentifizierung und Autorisierung von Azure OpenId Connect
WsFederationAuthentication - OWIN-Komponente zur Unterstützung der AAD Ws-Fed Passive föderierte Authentifizierung
WindowsAzureActiveDirectoryBearerAuthentication - OWIN-Komponente zur Unterstützung von AAD OAuth2-Autorisierungscodes, die einen aktiven Fluss gewähren
ActiveDirectoryFederationServicesBearerAuthentication - OWIN-Komponente zur Unterstützung von ADFS OAuth2-Autorisierungscode-Gewährung im aktiven Fluss
4. Erstellen und Ausführen, und klicken Sie auf der Startseite auf Anmelden.
Sie sehen 3 Schaltflächen unter "Einen anderen Dienst zur Anmeldung verwenden".
Federation - WsFederationAuthentication startet den passiven WS-Federation-Authentifizierungsfluss, wenn der Benutzer auf die Schaltfläche klickt.
Facebook - FacebookAuthentication startet den passiven Fluss der Facebook-Anmeldung.
OpenId Connect - OpenIdConnectAuthentication startet Azure OpenId Connect passive Authentifizierung und Autorisierung.
5. Implementierung einer Web UX, die vom Benutzer durch einen passiven Authentifizierungsfluss konsumiert werden kann, wie OpenId Connect, WS-Federation und Social Identity Federation.
Fügen Sie einen Controller hinzu, indem Sie "MVC 5 Controller - Empty" auswählen.
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; } }
Sobald Sie sich durch Klicken auf eine der Schaltflächen unter "Verwenden Sie einen anderen Dienst zum Einloggen" angemeldet haben, können Sie auf https://localhost:xxxxx/mvcvalues zugreifen.
6. Implementieren Sie jetzt eine Web-API, die von einem nativen Client durch einen aktiven Authentifizierungsfluss genutzt werden kann, wie OAuth2 einschließlich OpenId Connect, das auf OAuth2 aufbaut.
Fügen Sie den Controller hinzu, indem Sie "Web API 2 Controller - Empty" auswählen.
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. Erstellen Sie einen nativen Client (z. B. eine Konsolenanwendung), um den aktiven Fluss durch Zugriff auf https://localhost:xxxxx/api/values zu testen.
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(); } }