簡化模式定義
通過客戶端的后台服務器,與“服務提供商”的認證服務器進行認證。(和授權碼模式差不多哦)
1、用戶訪問客戶端,后者將前者導向認證服務器。
2、用戶選擇是否給予客戶端授權。
3、假設用戶給予授權,認證服務器會直接向客戶端發送訪問令牌(access token)。
4、Client拿着access token去訪問Resource資源
注意:紅色字體部分是與授權碼模式最根本的區別哦
簡化模式的工作流程圖:

圖 1 (網上搜到的簡化模式工作流程圖說明)
新建項目:ImplicitGrant
AuthorizationServer與ResourceServer還是用之前的項目

新建Index.cshtml
<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頁面的哦,這是簡化模式形成的原因
運行項目試試
開始授權
點擊認證按鈕,出現認證頁面和授權碼頁面一樣

點擊授權,直接返回的就是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權限認證系列
- asp.net權限認證:Forms認證
- asp.net權限認證:HTTP基本認證(http basic)
- asp.net權限認證:Windows認證
- asp.net權限認證:摘要認證(digest authentication)
- asp.net權限認證:OWIN實現OAuth 2.0 之客戶端模式(Client Credential)
- asp.net權限認證:OWIN實現OAuth 2.0 之密碼模式(Resource Owner Password Credential)
- asp.net權限認證:OWIN實現OAuth 2.0 之授權碼模式(Authorization Code)
- asp.net權限認證:OWIN實現OAuth 2.0 之簡化模式(Implicit)
