無責任Windows Azure SDK .NET開發入門篇二[使用Azure AD 進行身份驗證-2.2身份驗證開發]

2.2身份驗證開發

在咱們的案例中,咱們是用戶經過Web應用程序進行身份識別。html

image

上面的圖示說明了以下的一些概念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
其次咱們須要在Web.config文件的appSettings節添加以下配置節點
<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="" />
注意,因爲咱們使用的是世紀互聯的版本,因此ida:AADInstance、ida:GraphUrl的Url將固定爲 https://login.chinacloudapi.cn/{0}https://graph.chinacloudapi.cn。關於其餘的配置值將在Azure AD門戶部分講解。

而後咱們須要編寫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");
你已經注意到了,上面的代碼在讀取配置的時候沒有使用咱們傳統的WebConfigurationManager類,而是採用了Azure新加入的 CloudConfigurationManager 類,該類是用於訪問 Microsoft Azure 配置設置的靜態類,能夠從運行應用程序的平臺的相應配置存儲中讀取配置設置。Microsoft Azure 外部環境中運行的 .NET 應用程序一般在 web.config 或 app.config 文件中存儲配置設置。無論在哪一個環境中運行代碼,均可以使用 CloudConfigurationManager 類從適當的配置文件中讀取設置。

而後在AuthenticationHelper中添加一個方法AcquireTokenAsync,這個方法用於返回當前的用戶憑證,若是沒有憑證則拋出異常。

public static string Token;

public static async Task<string> AcquireTokenAsync()
{
    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登陸

代碼很是簡單,在當前上下文的採用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);
}
好了,如今登入登出的代碼已經完成了,咱們能夠嘗試下載咱們的MVC Web APP中執行體驗下。在MVC本身創建的架構中咱們能夠循着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>
            <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>

如今咱們執行代碼後,咱們看到的默認頁面是

image

點擊Sign in連接後將跳轉到微軟的登陸界面

image

點擊帳號後

image

輸入正確的密碼後,將跳回咱們應用的默認首頁,而且明顯的發現咱們已經使用了正確的身份登入了。

image

相關文章
相關標籤/搜索