WebApi增加Oauth2认证
前期搭建可看这篇博文: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 ,需要加密不?
觉得好就点个关注点个赞,留下你的思路或者说改进点哦 ☺ 还可以留下大佬有话的代码
WebApi增加Oauth2认证的更多相关文章
- WebApi使用OAuth2认证
本篇文章实现了四种认证方式中的客户端模式和密码模式,未实现token持久化 未介绍OAuth2的相关概念,全部是干货,可自己在网上搜索OAuth2相关知识,在这不做过多阐述 一.引用OAuth2所需的 ...
- ASP.NET WebApi 基于OAuth2.0实现Token签名认证
一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将是我们需要思考的问题.为了保护我们的WebApi数 ...
- 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议
概述说明 CAS Server默认搭建出来,客户端程序只能按照CAS自身的协议接入.CAS的强大在于,有官方的插件,可以支持其他的协议.本章节就让CAS Server怎么增加OAuth2.0的登录协议 ...
- Envoy实现.NET架构的网关(四)集成IdentityServer4实现OAuth2认证
什么是OAuth2认证 简单说,OAuth 就是一种授权机制.数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据.系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使 ...
- 基于Node的PetShop,oauth2认证RESTful API
前篇 - 基本认证,用户名密码 后篇 - OAuth2 认证 前文使用包passport实现了一个简单的用户名.密码认证.本文改用oauth2来实现更加安全的认证.全部代码在这里. OAUTH2 用户 ...
- 新浪微博的OAuth2认证过程
1. 创建应用 在weibo.com上申请一个应用,获取app key和app secret, 填写redirect uri 2. 获取code 通过在浏览器访问 https://api.weibo. ...
- 使用Fiddler获取OAuth2认证的access token时候返回502
微软动态CRM专家罗勇 ,回复322或者20190402可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 我这里Fiddler的Composer功能来获取OAuth2 认 ...
- 自动给 Asp.Net Core WebApi 增加 ApiVersionNeutral
自动给 Asp.Net Core WebApi 增加 ApiVersionNeutral Intro 新增加一个 Controller 的时候,经常忘记在 Controller 上增加 ApiVers ...
- Spring Cloud下基于OAUTH2认证授权的实现
GitHub(spring -boot 2.0.0):https://github.com/bigben0123/uaa-zuul 示例(spring -boot 2.0.0): https://gi ...
随机推荐
- LeetCode_242. Valid Anagram
242. Valid Anagram Easy Given two strings s and t , write a function to determine if t is an anagram ...
- 无限级分类,抓取某元素的所有下级id
mysql> select id,invite_qke_id from tf_qke; +----+---------------+ | id | invite_qke_id | +----+- ...
- Java基础教程:垃圾回收
Java基础教程:垃圾回收 垃圾回收 垃圾回收(Garbage Collection,GC),顾名思义是释放垃圾占用的空间,防止内存泄漏.有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使 ...
- 15、Vue CLI 3+tinymce 5富文本编辑器整合
富文本编辑器里大佬们都说tinymce NB! 插件安装 inymce官方提供了一个vue的组件tinymce-vue 如果有注册或购买过服务的话,直接通过组件配置api-key直接使用,懒的注册或者 ...
- NET中各种加密解密方法
/// <summary> /// AES对称加密和分组加密中的四种模式(ECB.CBC.CFB.OFB),这三种的区别,主要来自于密钥的长度,16位密钥=128位,24位密钥=192位, ...
- [转帖]InfiniBand, RDMA, iWARP, RoCE , CNA, FCoE, TOE, RDMA, iWARP, iSCSI等概念
InfiniBand, RDMA, iWARP, RoCE , CNA, FCoE, TOE, RDMA, iWARP, iSCSI等概念 2017-12-15 15:37:00 jhzh951753 ...
- python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据
当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作 ...
- 分布式自增ID算法snowflake
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的,作为索引非常不好,严重影响性能. ...
- C++ 中 static 与 const 的用法及对比
在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...
- Sublime实现自动排版
sublime功能很强大, 但是使用sublime就可以实现代码自动重新缩进,使代码缩进重排 方法:Ctrl+A选中全部内容,然后在菜单中选择Edit->Line->Reindent