Unity + iBatis + Asp.net Mvc 系統搭建

來源:互聯網
上載者:User

標籤:

在前一篇博文中,我們通過以 OAuth 的 Client Credential Grant 授權方式(只驗證調用用戶端,不驗證登入使用者)拿到的 Access Token ,成功調用了與使用者無關的 Web API。

在這篇博文中,我們將以 OAuth 的 Resource Owner Password Credentials Grant 的授權方式( grant_type=password )擷取 Access Token,並以這個 Token 調用與使用者相關的 Web API。

對應的應用情境是:為自家的網站開發手機 App(非第三方 App),只需使用者在 App 上登入,無需使用者對 App 所能訪問的資料進行授權。

根據 OAuth 規範,用戶端擷取 Access Token 的請求方式如下:

POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencodedgrant_type=password&username=johndoe&password=A3ddj3w

根據上面的請求方式,在 C# 中用 HttpClient 實現一個簡單的用戶端,代碼如下:

public class OAuthClientTest{    private HttpClient _httpClient;    public OAuthClientTest()    {        _httpClient = new HttpClient();        _httpClient.BaseAddress = new Uri("http://openapi.cnblogs.com");    }     [Fact]    public async Task Get_Accesss_Token_By_Resource_Owner_Password_Credentials_Grant()    {        Console.WriteLine(await GetAccessToken());    }    private async Task<string> GetAccessToken()    {        var clientId = "1234";        var clientSecret = "5678";        var parameters = new Dictionary<string, string>();                    parameters.Add("grant_type", "password");        parameters.Add("username", "部落格園團隊");        parameters.Add("password", "cnblogs.com");        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(            "Basic",            Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret))            );        var response = await _httpClient.PostAsync("/token", new FormUrlEncodedContent(parameters));        var responseValue = await response.Content.ReadAsStringAsync();        if (response.StatusCode == System.Net.HttpStatusCode.OK)        {            return JObject.Parse(responseValue)["access_token"].Value<string>();        }        else        {            Console.WriteLine(responseValue);            return string.Empty;        }    }}

(註:與之前相比,這裡的 client_id/client_secret 改為了 Basic Authorization,以更好的遵循 OAuth 規範)

在服務端,基於 Owin OAuth, 針對 Resource Owner Password Credentials Grant 的授權方式,只需重載 OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials() 方法即可。代碼如下:

public class CNBlogsAuthorizationServerProvider : OAuthAuthorizationServerProvider{    //...    public override async Task GrantResourceOwnerCredentials(        OAuthGrantResourceOwnerCredentialsContext context)    {        //調用背景登入服務驗證使用者名稱與密碼        var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);        oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));        var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());        context.Validated(ticket);        await base.GrantResourceOwnerCredentials(context);    }}

完整的CNBlogsAuthorizationServerProvider實現代碼如下(與之前相比,context.TryGetFormCredentials 改為了 context.TryGetBasicCredentials):

 CNBlogsAuthorizationServerProvider

這樣,運行用戶端程式就可以拿到 Access Token 了。

接下來,我們拿著以這種方式擷取的 Access Token,就可以調用與使用者相關的 Web API 了。

在服務端我們通過一個簡單的 Web API 測試一下,代碼如下:

public class UsersController : ApiController{    [Authorize]    public string GetCurrent()    {        return User.Identity.Name;        //這裡可以調用後台使用者服務,擷取使用者相關數所,或者驗證使用者權限進行相應的操作    }}

然後,用戶端用以 grant_type=password 方式拿到的 Access Token 調用這個Web API,用戶端增加的代碼如下:

[Fact]public async Task Call_WebAPI_By_Resource_Owner_Password_Credentials_Grant(){    var token = await GetAccessToken();    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);    Console.WriteLine(await (await _httpClient.GetAsync("/api/users/current")).Content.ReadAsStringAsync());}

用戶端運行結果如下:

"部落格園團隊"

調用成功!運行結果正是擷取 Access Token 時所用的 username 。 

結合 ASP.NET 現有的安全機制,藉助 OWIN 的威力,Microsoft.Owin.Security.OAuth 的確讓開發基於 OAuth 的 Web API 變得更簡單。

  標籤: OAuth, WebAPI 分類: .Net Framework, Asp.net MVC

Unity + iBatis + Asp.net Mvc 系統搭建

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.