經過客戶端的後臺服務器,與「服務提供商」的認證服務器進行認證。(和受權碼模式差很少哦)javascript
一、用戶訪問客戶端,後者將前者導向認證服務器。
二、用戶選擇是否給予客戶端受權。
三、假設用戶給予受權,認證服務器會直接向客戶端發送訪問令牌(access token)。
四、Client拿着access token去訪問Resource資源html
注意:紅色字體部分是與受權碼模式最根本的區別哦java
圖 1 (網上搜到的簡化模式工做流程圖說明)web
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"; } }
再次試試,成功返回數據