经过客户端的后台服务器,与“服务提供商”的认证服务器进行认证。(和受权码模式差很少哦)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"; } }
再次试试,成功返回数据