在ASP.NET中基於Owin OAuth使用Client Credentials Grant授權發放Token

來源:互聯網
上載者:User

標籤:

OAuth真是一個複雜的東東,即使你把OAuth規範倒背如流,在具體實現時也會無從下手。因此,Microsoft.Owin.Security.OAuth應運而生(它的實現代碼在Katana項目中),協助開發人員偷了不少工,減了不少料。

這篇博文試圖通過一個簡單的樣本分享一下如何基於Microsoft.Owin.Security.OAuth,使用Client Credentials Grant授權方式給用戶端發放access token。

Client Credentials Grant的授權方式就是只驗證用戶端(Client),不驗證使用者(Resource Owner),只要用戶端通過驗證就發access token。舉一個對應的應用情境例子,比如我們想提供一個“擷取網站首頁最新博文列表”的WebAPI給iOS App調用。由於這個資料與使用者無關,所以不涉及使用者登入與授權,不需要Resource Owner的參與。但我們不想任何人都可以調用這個WebAPI,所以要對用戶端進行驗證,而使用OAuth中的 Client Credentials Grant 授權方式可以很好地解決這個問題。

具體實現方式如下:

1)用Visual Studio 2013/2015建立一個Web API項目,VS會產生一堆OAuth相關代碼。

2)開啟Startup.Auth.cs ,精簡一下代碼,我們只需要實現以Client Credentials Grant授權方式拿到token,其它無關代碼全部清除,最終剩下如下代碼:

public partial class Startup{    public void ConfigureAuth(IAppBuilder app)    {        var OAuthOptions = new OAuthAuthorizationServerOptions        {            TokenEndpointPath = new PathString("/token"),            Provider = new CNBlogsAuthorizationServerProvider(),            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),            AllowInsecureHttp = true        };        app.UseOAuthBearerTokens(OAuthOptions);    }}

3)建立一個新的類 CNBlogsAuthorizationServerProvider,並繼承自 OAuthAuthorizationServerProvider,重載 OAuthAuthorizationServerProvider() 與 GrantClientCredentials() 這兩個方法。代碼如下:

public class CNBlogsAuthorizationServerProvider : OAuthAuthorizationServerProvider{    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)    {        string clientId;        string clientSecret;        context.TryGetFormCredentials(out clientId, out clientSecret);        if (clientId == "1234" && clientSecret == "5678")        {            context.Validated(clientId);        }        return base.ValidateClientAuthentication(context);    }    public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)    {        var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);        oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, "iOS App"));        var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());        context.Validated(ticket);        return base.GrantClientCredentials(context);    }}

在 ValidateClientAuthentication() 方法中擷取用戶端的 client_id 與 client_secret 進行驗證。

在 GrantClientCredentials() 方法中對用戶端進行授權,授了權就能發 access token 。

這樣,OAuth的服務端代碼就完成了。這麼簡單?是的,就這麼簡單,因為有了Microsoft.Owin.Security.OAuth。

4)然後寫用戶端調用代碼測試一下:

public class OAuthClientTest{    private HttpClient _httpClient;    public OAuthClientTest()    {        _httpClient = new HttpClient();        _httpClient.BaseAddress = new Uri("http://openapi.cnblogs.com");    }    [Fact]    public void Get_Accesss_Token_By_Client_Credentials_Grant()    {        var parameters = new Dictionary<string, string>();        parameters.Add("client_id", "1234");        parameters.Add("client_secret", "5678");        parameters.Add("grant_type", "client_credentials");        Console.WriteLine(_httpClient.PostAsync("/token", new FormUrlEncodedContent(parameters))            .Result.Content.ReadAsStringAsync().Result);    }}

運行結果如下:

{"access_token":"8PqaWilv_SJT7vRXambP7Mebyaf3KO1GXYHsqA-oPMOQF6xk1YpluczOZGo-WwATU5YmGb0wSR0cUQMC8RSZfwO8nwom7yG11FIANhy2PNiqTg2CYdJF0sf0ggFs6it_i3mc_m1iEFCK2dLBPDJXPI24wngCPR0wP_zugZvyKv314BM0PQmnnwg3kLXR1DISKRbs5-i59VCtFSZgkM7A0w","token_type":"bearer","expires_in":1209599}

搞定!

【參考資料】

ASP.Net MVC: Creating an OAuth client credentials grant type token endpoint 

在ASP.NET中基於Owin OAuth使用Client Credentials Grant授權發放Token

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.