在咱們的案例中,咱們是用戶經過Web應用程序進行身份識別。html
上面的圖示說明了以下的一些概念web
l Azure AD 是標識提供程序,負責對組織的目錄中存在的用戶和應用程序的標識進行驗證,並最終在那些用戶和應用程序成功經過身份驗證時頒發安全令牌。api
l 但願將身份驗證外包給 Azure AD 的應用程序必須在 Azure AD 中進行註冊,Azure AD 將在目錄中註冊並惟一地標識該應用程序。安全
l 在用戶經過身份驗證後,應用程序必須對用戶的安全令牌進行驗證以確保身份驗證對於目標方是成功的。架構
l 身份驗證過程的請求和響應流是由所使用的身份驗證協議(例如 OAuth 2.0、OpenID Connect、WS-Federation 或 SAML 2.0)決定的app
這章咱們將簡單的對Azure AD的開發進行入門性的嘗試,包括身份驗證登陸、基自己份信息的存儲。要完成Azure AD的應用開發須要在Azure門戶和開發環境中各自完成一些工做。async
Azure AD開發部分ide
首先咱們須要引入如下組件庫ui
Microsoft.IdentityModel.Clients.ActiveDirectory
Microsoft.IdentityModel.Protocol.Extensions
Microsoft.Owin
Microsoft.Owin.Host.SystemWeb
Microsoft.Owin.Security
Microsoft.Owin.Security.Cookies
Microsoft.Owin.Security.OpenIdConnect
Microsoft.Web.Infrastructure
Microsoft.WindowsAzure.ConfigurationManager.
System.IdentityModel.Tokens.Jwt
<ADD KEY="IDA:CLIENTID" VALUE=" " /> <ADD KEY="IDA:TENANT" VALUE=" " /> <ADD KEY="IDA:TENANTID" VALUE="" /> <ADD KEY="IDA:AADINSTANCE" VALUE="HTTPS://LOGIN.CHINACLOUDAPI.CN/{0}" /> <ADD KEY="IDA:POSTLOGOUTREDIRECTURI" VALUE=" " /> <ADD KEY="IDA:GRAPHURL" VALUE="HTTPS://GRAPH.CHINACLOUDAPI.CN" /> <ADD KEY="IDA:APPKEY" VALUE="" />
而後咱們須要編寫AuthenticationHelper類來輔助咱們處理有關受權的基本處理,AuthenticationHelper有兩大部分,第一部分是經過靜態字段來讀取在Web.config文件的appSettings節配置的有關Azure AD的信息。spa
public static readonly string Tenant = CloudConfigurationManager.GetSetting("ida:Tenant"); public static readonly string TenantId = CloudConfigurationManager.GetSetting("ida:TenantId"); public static readonly string LoginUrl = CloudConfigurationManager.GetSetting("ida:AADInstance"); public static readonly string GraphUrl = CloudConfigurationManager.GetSetting("ida:GraphUrl"); public static readonly string AppKey = CloudConfigurationManager.GetSetting("ida:AppKey"); public static readonly string AuthorityUrl = String.Format(CultureInfo.InvariantCulture, LoginUrl, TenantId); public static readonly string AuthString = CloudConfigurationManager.GetSetting("ida:Auth") + CloudConfigurationManager.GetSetting("ida:Tenant"); public static readonly string ClaimsSchemas = "http://schemas.microsoft.com/identity/claims/objectidentifier"; public static readonly string ClientId = CloudConfigurationManager.GetSetting("ida:ClientId"); public static readonly string ClientSecret = CloudConfigurationManager.GetSetting("ida:ClientSecret"); public static readonly string PostLogoutRedirectUri = CloudConfigurationManager.GetSetting("ida:PostLogoutRedirectUri");
而後在AuthenticationHelper中添加一個方法AcquireTokenAsync,這個方法用於返回當前的用戶憑證,若是沒有憑證則拋出異常。
public static string Token; public static async Task<string> AcquireTokenAsync() { if (Token == null || Token.IsEmpty()) { throw new Exception("Authorization Required."); } return Token; }
public static ActiveDirectoryClient GetActiveDirectoryClient() { Uri baseServiceUri = new Uri(GraphUrl); ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(new Uri(baseServiceUri, TenantId), async () => await AcquireTokenAsync()); return activeDirectoryClient; }
SignIn
SignOut
SignIn登陸
代碼很是簡單,在當前上下文的採用OpenID進行身份詢問獲取
public void SignIn() { if (!Request.IsAuthenticated) { HttpContext.GetOwinContext() .Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType); } }
SignOut登出
一樣代碼簡單明確
public void SignOut() { string userObjectID = ClaimsPrincipal.Current.FindFirst(AuthenticationHelper.ClaimsSchemas).Value; var authContext = new AuthenticationContext(AuthenticationHelper.AuthorityUrl, new NaiveSessionCache(userObjectID)); authContext.TokenCache.Clear(); AuthenticationHelper.Token = null; HttpContext.GetOwinContext().Authentication.SignOut(OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType); }
@if (Request.IsAuthenticated) { <text> <ul class="nav navbar-nav navbar-right"> <li class="navbar-text"> Hello, @User.Identity.Name! </li> <li> @Html.ActionLink("Sign out", "SignOut", "AzureActiveDirectory") </li> </ul> </text> } else { <ul class="nav navbar-nav navbar-right"> <li>@Html.ActionLink("Sign in", "SignIn", "AzureActiveDirectory", routeValues: null, htmlAttributes: new { id = "loginLink" })</li> </ul> }
上面的代碼經過一個if完成登錄後出現Sign out連接和登出狀態爲Sign in連接。而後在View\ Shared\ _LoginPartial.cshtml加入這個_LoginPartial.cshtml咱們就在主模板擁有了登陸登出的連接功能。我對_LoginPartial.cshtml此處的修改以下
<div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li>@Html.ActionLink("主頁", "Index", "Home")</li> <li>@Html.ActionLink("關於", "About", "Home")</li> <li>@Html.ActionLink("聯繫方式", "Contact", "Home")</li> </ul> @Html.Partial("_LoginPartial") </div>
如今咱們執行代碼後,咱們看到的默認頁面是
點擊Sign in連接後將跳轉到微軟的登陸界面
點擊帳號後
輸入正確的密碼後,將跳回咱們應用的默認首頁,而且明顯的發現咱們已經使用了正確的身份登入了。