前期搭建可看这篇博文:https://www.cnblogs.com/lnice/p/6857203.html,此博文是在本篇博文实践才产生的,在实践中,也产生了几个问题,希望能够共同交流,一起进步。
在此次测试,我们分为前后端:后端 :WebAPI
前段 Jquery
主要是测试,对于前段框架,我也不怎么熟悉,比如VUE,这些类似风格的 ,我熟悉知识 Boostrap 这种简单样式框架,不得不说,这是我的悲哀
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace WebAPI5.Models
{
/// <summary>
/// 用户信息类
/// </summary>
public class UserInfo
{
/// <summary>
/// ID
/// </summary>
public int id { get; set; }
/// <summary>
/// 用户姓名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 用户密码
/// </summary>
public string UserPwd { get; set; }
/// <summary>
/// 性别 0 是女 1 是男
/// </summary>
public int UserSex { get; set; } }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebAPI5.Models; namespace WebAPI5.Controllers
{
[Authorize]
public class BlogController : ApiController
{
//查询所有员工
[HttpGet]
public IHttpActionResult GetAll()
{
List<UserInfo> uf = new List<UserInfo>() {
new UserInfo { id=, UserName="陈粒", UserPwd="weeweewwee", UserSex=},
new UserInfo { id=, UserName="小半", UserPwd="qdaqwdqqd", UserSex=},
new UserInfo { id=, UserName="Grain", UserPwd="dasad", UserSex=},
new UserInfo { id=, UserName="Cgrain", UserPwd="weeadadweewwee", UserSex=}
};
return Json(uf);
}
}
}
Controllers
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{ context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); string usepwd = context.Password;
string usename = context.UserName;
////判断是否有这个账号,有才能访问
if (usename.Contains("C")&& usepwd.Contains("C"))
{
context.SetError("invalid_grant", "The username or password is incorrect");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
context.Validated(identity); }
SimpleAuthorizationServerProvider
<!DOCTYPE html>
<html lang="en"> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta charset="utf-8" />
<title>你的 ASP.NET 应用程序</title>
<script src="jquery-1.10.2.min.js"></script>
</head> <body>
<input type="text" id="username" />
<input type="text" id="pwd" />
<input type="button" onclick="add()" value="Come On" />
<input type="button" onclick="showdata()" value="显示data" />
<input type="button" onclick="reftoken()" value="刷新token" /> <div>
<ul id="My_ul"></ul>
</div>
<script>
var token;
var refresh_token;
function add() {
$.ajax({
url: "http://localhost:1985/token",
dataType: "Json",
method: "POST",
data: {
"grant_type": "password",
"UserName": $("#username").val(),
"Password": $("#pwd").val() },
success: function (data) {
console.log(data);
token = data["access_token"];
refresh_token = data["refresh_token"];
console.log(refresh_token);
$.ajax({
url: "http://localhost:1985/api/Blog/GetAll",
dataType: "Json",
method: "GET",
headers: {
"Authorization": "Bearer " + token //把登录获取的Token加入到http请求头中
},
success: function (data) { console.log(data);
},
error: function (error) {
alert(error["message"]); } });
},
error: function (error) { alert(error["responseJSON"]["error_description"]);
//console.log(error);
// alert(error["error_description"]);
} }); };
function showdata() {
$.ajax({
url: "http://localhost:1985/api/Blog/GetAll",
dataType: "Json",
method: "GET",
headers: {
"Authorization": "Bearer " + token //把登录获取的Token加入到http请求头中
},
success: function (data) {
var html = "";
for (index = 0; index < data.length; index++) {
html += "<li> " + data[index]["UserName"] + " </li>"; }
$("#My_ul").append(html)
console.log(data);
},
complete: function (xhr, ts) { // console.log();
// console.log
// (ts);
if (xhr.status== 401 ) {
reftoken();
showdata();
}
}
// },
// error: function (error) {
// alert(error["responseJSON"]["message"]); // } }); } function reftoken() {
$.ajax({
url: "http://localhost:1985/token",
dataType:"Json",
type:"POST",
data: {
"grant_type": "refresh_token",
"refresh_token": refresh_token
},
success: function (data) {
console.log(data)
token=data["access_token"];
refresh_token=data["refresh_token"]; },
error: function (error) {
console.log(error);
} }); }
</script>
</body> </html>
Html
为了便于观察 ,我expires_in 设置一分钟
这里报错是因为我们的token 已经过期,为了不影响用户操作,我们刷新了token,在重新请求了数据
随后我又点击了显示数据按钮
显示了两次:
为了便于观察,我们修改已经ajax
showdata 方法,我们注释掉token过期重新获取的方法调用
点击请求都没有了数据
我们刷新token
我们突然发现,刚刚获取的token过期(其实没过期的)
ajax 请求,每次都会进入这个方法,所以才会有我们的 if 判断 ,只有当请求是401 的时候(这里可以再详细一点,指出错误请求的类型或者原因,更精确的判断)
好了,这里就是简单的介绍了,当时这样,我也发现了几个问题:
第一个问题: 尽管我们用到了api的授权,可是,如何防止他大规模的数据调用。
第二个问题:前后端分离的项目,或者说未分离的项目,肯定不是这样调用的,这样子,我总根据不安全(只能把一些技术在我之下的大佬给拦截,技术在我之上的大佬,估计看到这篇文件就在呵呵了,心想:要是每个api都这样,我就不难了 o(╥﹏╥)o),好了,这个问题就是:如何标准化?没用到vue 前段只是简单的使用 boostrap +ajax (自我感觉这个问题也问到了也许有部分人的心声,并不是每个人做的项目都比较超强,其实还有许多大佬们,许多普通人,做的项目都比较普通,还有很多人还在苦海中挣扎,比如我),如何更安全的使用标准化?
第三个问题:自定义修改他的返回:比如说:
如何修改呀??
第四个问题: 我们返回给前段的token ,需要加密不?
觉得好就点个关注点个赞,留下你的思路或者说改进点哦 ☺ 还可以留下大佬有话的代码