asp.net權限認證:OWIN實現OAuth 2.0 之簡化模式(Implicit)

簡化模式定義

經過客戶端的後臺服務器,與「服務提供商」的認證服務器進行認證。(和受權碼模式差很少哦)javascript

一、用戶訪問客戶端,後者將前者導向認證服務器。
二、用戶選擇是否給予客戶端受權。
三、假設用戶給予受權,認證服務器會直接向客戶端發送訪問令牌(access token)。
四、Client拿着access token去訪問Resource資源html

注意:紅色字體部分是與受權碼模式最根本的區別哦java

 

簡化模式的工做流程圖:

圖 1 (網上搜到的簡化模式工做流程圖說明)web

新建項目:ImplicitGrant

AuthorizationServer與ResourceServer仍是用以前的項目ajax

新建Index.cshtmlapi

    <form id="form1">
        <div>
            Access Token<br />
            <input id="AccessToken" name="AccessToken" />
            <input id="Authorize" type="button" name="signin.AccessToken" value="向認證服務器申請受權" />
            <br />
            <input id="CallApi" name="submit.CallApi" value="訪問受控資源" type="button" />
        </div>
        <div id="output">
        </div>
    </form> 
     var authorizeUri = 'http://localhost:8270/OAuth/Authorize';
        var returnUri = 'http://localhost:3622/Home/SignIn';
        var apiUri = 'http://localhost:8001/api/Values';

        $('#Authorize').click(function () {
            var nonce = 'my-nonce';

            var uri = addQueryString(authorizeUri, {
                'client_id': '7890ab',
                'redirect_uri': returnUri,
                'state': nonce,
                'scope': 'scope1 scope2',
                'response_type': 'token',
            });

            window.oauth = {};
            window.oauth.signin = function (data) {
                if (data.state !== nonce) {
                    return;
                }

                $('#AccessToken').val(data.access_token);
            }

            window.open(uri, 'Authorize', 'width=640,height=480');
        });

        $('#CallApi').click(function () {
            $.ajax(apiUri, {
                beforeSend: function (xhr) {
                    xhr.setRequestHeader('Authorization', 'Bearer ' + $('#AccessToken').val());
                },
                dataType: 'text',
                cache: false,
                success: function (data) {
                    console.log(data);
                    $('#output').text(data);
                }
            });
        });

OK,自此,簡化模式測試項目有效代碼已經完成了跨域

注意:邏輯是故意寫在html頁面而沒有寫在後臺cs頁面的哦,這是簡化模式造成的緣由服務器

運行項目試試cors

開始受權

點擊認證按鈕,出現認證頁面和受權碼頁面同樣asp.net

點擊受權,直接返回的就是token

點擊訪問受控資源,發現沒有預期那樣返回資源數據

 

這是js跨域的問題,須要在ResourceServer項目加上「microsoft.aspnet.webapi.cors」引用

並在WebApiConfig.cs頁面加上

// 跨域配置
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

在ValuesController中的Get方式上貼上[HttpGet]  

   public class ValuesController : ApiController
    {
        [HttpGet]
        [Authorize]
        public string Get()
        {
            return "lanxiaoke";
        }
    }

再次試試,成功返回數據

 

 asp.net權限認證系列 

  1. asp.net權限認證:Forms認證
  2. asp.net權限認證:HTTP基本認證(http basic)
  3. asp.net權限認證:Windows認證
  4. asp.net權限認證:摘要認證(digest authentication)
  5. asp.net權限認證:OWIN實現OAuth 2.0 之客戶端模式(Client Credential)
  6. asp.net權限認證:OWIN實現OAuth 2.0 之密碼模式(Resource Owner Password Credential)
  7. asp.net權限認證:OWIN實現OAuth 2.0 之受權碼模式(Authorization Code)
  8. asp.net權限認證:OWIN實現OAuth 2.0 之簡化模式(Implicit)
相關文章
相關標籤/搜索