本篇文章為大家展示了Windows Azure SDK .NET開發(fā)中Azure AD如何管理用戶信息,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比平山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式平山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋平山地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。
之所以將Azure AD 作為開始,是應(yīng)為基本上我們所有應(yīng)用都需要進(jìn)行安全管理。Azure Active Directory (Azure AD) 通過以下方式簡化了對開發(fā)人員的身份驗證:將標(biāo)識提供為一項服務(wù)、支持行業(yè)標(biāo)準(zhǔn)協(xié)議(例如 OAuth 2.0 和 OpenID Connect),并提供用于不同平臺的開源庫來幫助你快速開始編碼。
Azure Active Directory (Azure AD) 提供了一種簡便的方法,讓企業(yè)可以在云中和本地管理標(biāo)識和訪問。你的用戶可以使用相同的工作或?qū)W校帳戶,以單一登錄到任何云和本地 Web 應(yīng)用程序。你的用戶可以使用其最喜歡的設(shè)備,包括 iOS、Mac OS X、Android 和 Windows。你的組織可以使用集成的多因素身份驗證,在本地和云中保護(hù)敏感數(shù)據(jù)和應(yīng)用程序,從而確保本地和遠(yuǎn)程訪問的安全。
而且Azure Active Directory (AD) 在大多數(shù) Microsoft 云服務(wù)后面提供核心目錄和身份管理功能。這些服務(wù)包括但不限于:
Azure
Microsoft Office 365
Microsoft Dynamics CRM Online
Windows Intune
當(dāng)你注冊 Microsoft 云服務(wù)時,便會獲得一個 Azure AD 目錄。你可根據(jù)需要創(chuàng)建更多的目錄。例如,可以將第一個目錄保留為生產(chǎn)目錄,然后創(chuàng)建另一個目錄進(jìn)行測試或過渡。
在啟用云的工作區(qū)中,可以將租戶定義為擁有并管理該云服務(wù)的特定實例的客戶端或組織。租戶使用 Microsoft Azure 提供的標(biāo)識平臺,它只是你的組織在注冊 Azure 或 Office 365 等 Microsoft 云服務(wù)時接收并擁有的 Azure Active Directory (Azure AD) 專用實例。每個 Azure AD 目錄都是獨特的,獨立于其他 Azure AD 目錄。就像公司辦公大樓是你的組織特有的安全資產(chǎn)一樣,根據(jù)設(shè)計,Azure AD 目錄也是僅供你的組織使用的安全資產(chǎn)。Azure AD 體系結(jié)構(gòu)隔離了客戶數(shù)據(jù)和身份信息,避免混合存放。這意味著,一個 Azure AD 目錄的用戶和管理員不可能意外或惡意性地訪問另一目錄中的數(shù)據(jù)。
我現(xiàn)在有兩個Azure AD目錄,當(dāng)然也就是有兩個Azure AD租戶。
現(xiàn)在,當(dāng)你注冊 Azure 時,將自動創(chuàng)建一個目錄,你的訂閱將與該目錄相關(guān)聯(lián)。使用 Azure AD 不收取費用。目錄是免費資源。還有一個收費的Azure Active Directory 高級版級別,它提供額外的功能,例如公司品牌和自助密碼重置。有意思的是Azure AD目錄建立完畢后是可以改名字的,所以你在初次起名字時就不必猶猶豫豫了。
在我們的案例中,我們是用戶通過Web應(yīng)用程序進(jìn)行身份識別。
Azure AD 是標(biāo)識提供程序,負(fù)責(zé)對組織的目錄中存在的用戶和應(yīng)用程序的標(biāo)識進(jìn)行驗證,并最終在那些用戶和應(yīng)用程序成功通過身份驗證時頒發(fā)安全令牌。
希望將身份驗證外包給 Azure AD 的應(yīng)用程序必須在 Azure AD 中進(jìn)行注冊,Azure AD 將在目錄中注冊并唯一地標(biāo)識該應(yīng)用程序。
在用戶通過身份驗證后,應(yīng)用程序必須對用戶的安全令牌進(jìn)行驗證以確保身份驗證對于目標(biāo)方是成功的。
身份驗證過程的請求和響應(yīng)流是由所使用的身份驗證協(xié)議(例如 OAuth 2.0、OpenID Connect、WS-Federation 或 SAML 2.0)決定的
這章我們將簡單的對Azure AD的開發(fā)進(jìn)行入門性的嘗試,包括身份驗證登錄、基本身份信息的存儲。要完成Azure AD的應(yīng)用開發(fā)需要在Azure門戶和開發(fā)環(huán)境中各自完成一些工作。
Azure AD開發(fā)部分
首先我們需要引入以下組件庫
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
其次我們需要在Web.config文件的appSettings節(jié)添加如下配置節(jié)點
注意,由于我們使用的是世紀(jì)互聯(lián)的版本,所以ida:AADInstance、ida:GraphUrl的Url將固定為https://login.chinacloudapi.cn/{0}和https://graph.chinacloudapi.cn。關(guān)于其他的配置值將在Azure AD門戶部分講解。
然后我們需要編寫AuthenticationHelper類來輔助我們處理有關(guān)授權(quán)的基本處理,AuthenticationHelper有兩大部分,第一部分是通過靜態(tài)字段來讀取在Web.config文件的appSettings節(jié)配置的有關(guān)Azure AD的信息。
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");
你已經(jīng)注意到了,上面的代碼在讀取配置的時候沒有使用我們傳統(tǒng)的WebConfigurationManager類,而是采用了Azure新加入的CloudConfigurationManager類,該類是用于訪問 Microsoft Azure 配置設(shè)置的靜態(tài)類,可以從運行應(yīng)用程序的平臺的相應(yīng)配置存儲中讀取配置設(shè)置。Microsoft Azure 外部環(huán)境中運行的 .NET 應(yīng)用程序通常在 web.config 或 app.config 文件中存儲配置設(shè)置。不管在哪個環(huán)境中運行代碼,都可以使用CloudConfigurationManager類從適當(dāng)?shù)呐渲梦募凶x取設(shè)置。
然后在AuthenticationHelper中添加一個方法AcquireTokenAsync,這個方法用于返回當(dāng)前的用戶憑證,如果沒有憑證則拋出異常。
public static string Token;
public static async Task
{
if (Token == null || Token.IsEmpty())
{
throw new Exception("Authorization Required.");
}
return Token;
}
然后我們再添加GetActiveDirectoryClient方法來獲取對Azure AD的客戶端對象引用。
public static ActiveDirectoryClient GetActiveDirectoryClient()
{
Uri baseServiceUri = new Uri(GraphUrl);
ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(new Uri(baseServiceUri, TenantId), async () => await AcquireTokenAsync());
return activeDirectoryClient;
}
AuthenticationHelper到此就完成了,我們建立一個控制器AzureActiveDirectoryController,這個控制器將包含以下方法來使用AuthenticationHelper類。
SignIn
SignOut
SignIn登錄
代碼非常簡單,在當(dāng)前上下文的采用OpenID進(jìn)行身份詢問獲取
public void SignIn()
{
if (!Request.IsAuthenticated)
{
HttpContext.GetOwinContext()
.Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
SignOut登出
同樣代碼簡單明確vm
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);
}
好了,現(xiàn)在登入登出的代碼已經(jīng)完成了,我們可以嘗試下載我們的MVC Web APP中執(zhí)行體驗下。在MVC自己建立的架構(gòu)中我們可以循著View\ Shared\ _LoginPartial.cshtml找到通用的登入登出的View界面,然后修改代碼為
@if (Request.IsAuthenticated)
{
< text>
< ul class="nav navbar-nav navbar-right">
< li class="navbar-text">
Hello, @User.Identity.Name!
< li>
@Html.ActionLink("Sign out", "SignOut", "AzureActiveDirectory")
< /li>
< /ul>
< /text>
}
else
{