Web API使用记录系列(四)OAuth授权与身份校验
呼,开干第四篇,基于OWIN搭建OAuth认证授权服务器与接口身份校验。
OAuth包含授权码模式、密码模式、客户端模式和简化模式,这里我们文章记录的是密码模式和客户端模式。
目录
引用安装
授权处理-发放Token
用户名密码授权
客户端授权
身份校验-校验失败自定义返回信息
TestClient增加token获取
一、引用安装
除了Owin使用时安装的引用外,还需要安装以下引用
Microsoft.Owin.Security.OAuth
Microsoft.Owin.Security.Cookies
Microsoft.AspNet.Identity.Owin
二、搭建授权认证
修改StartUp,添加关键词partial
在App_Start下新建StartUp.Auth,同样使用关键词partial,添加ConfiguerAuth,代码如下:
public partial class StartUp
{
/// <summary>
/// OAuth配置
/// </summary>
/// <param name="app"></param>
public void ConfigureAuth(IAppBuilder app)
{
app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/api/token"),//授权地址
AccessTokenExpireTimeSpan = TimeSpan.FromHours(), //过期时间
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
Provider = new SampleAuthorizationServerProvider() //授权服务
});
}
}
SampleAuthorizationServerProvider是提供授权服务的方法,继承自OAuthAuthorizationServerProvider,包含客户端认证和用户名密码认证,代码如下
/// <summary>
/// 授权服务
/// </summary>
public class SampleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
#region 客户端授权
/// <summary>
/// 客户端验证
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId = "";
string clientSecret = "";
//获取传入的客户端id和客户端校验码
context.TryGetFormCredentials(out clientId, out clientSecret);
if (clientId == "发放的客户端id" && clientSecret == "发放的客户端校验码")
{
context.Validated(clientId);
}
else
{
context.SetError("invalid_client", "client is not valid");
}
return base.ValidateClientAuthentication(context);
} /// <summary>
/// 客户端授权-生成access token
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)
{
var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, "app"));//可以继续加一些其它信息
var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties() { AllowRefresh = false });
context.Validated(ticket);
return base.GrantClientCredentials(context);
}
#endregion #region 用户名密码授权
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
if (context.UserName == "用户名" && context.Password == "用户密码")
{
var props = new AuthenticationProperties(new Dictionary<string, string>
{
{
"userName", context.UserName
}
});
var identity = new ClaimsIdentity("userinfo");
identity.AddClaim(new Claim("DisplayName", "张三"));
identity.AddClaim(new Claim("DutyName", "总监")); var ticket = new AuthenticationTicket(identity, props); context.Validated(ticket);
}
else
{
context.SetError("invalid_user", "username or password error");
}
return base.GrantResourceOwnerCredentials(context);
}
#endregion }
在根目录App_Start中增加 ConfigureAuth(app);
请求Token(以客户端验证为示例)
$.ajax({
url: '/api/token',
type: 'post',
data: {
"grant_type": "client_credentials",
"client_id": $("#clientid").val(),
"client_secret": $("#clientscuret").val()
},
dataType: "json",
success: function (data) {
var accessToken = data.access_token;
console.log("获取到的token:"+accessToken);
}
});
三、身份认证与身份认证失败自定义返回
增加身份认证,只需要在需要使用的controller上增加 特性 [Authorize]
不需要启用验证的使用特性 [AllowAnonymous]
认证失败返回401,但为了和我们项目的返回数据结构一致,我们需要在认证失败的时候修改返回,新建过滤器继承AuthorizeAttribute,完事将使用Authorized的地方替换为自定义的过滤器
public class CustomAuthorizeAttribute:AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
base.HandleUnauthorizedRequest(actionContext);
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.OK)
{
Content = new StringContent("项目返回的数据格式数据")
};
}
}
四、TestClient
为了方便在线测试接口添加token的方便,我们需要给弹出的调用窗口增加authorization的header信息、获取token的操作;并将获取到的token存储到cookie,打开窗口时存在自填充,省去每次的获取操作
》文件TestClientDialogs文件,在<div class="panel"> 内添加如下代码
<div style="margin-bottom:10px;background:#EFEFEF;border:1px solid #ccc;padding:10px">
<div>
客户端id:
<input type="text" id="clientid" value="admin" />
客户端securet:
<input type="password" id="clinetsecuret" value="admin" />
<a href='javascript:;' id="btngettk">获取 Token</a>
</div>
<div style="padding:5px;background:#ffd800;" id="getmsg"> <span> 正在获取Token,请稍后...</span></div>
</div> <hr />
》WebApiTestClient.js中修改如下(TestClientViewModel方法末尾添加):
//支持弹出窗口自动填充token
var accessToken;
try {
accessToken = $.cookie("token");
} catch (e) {
console.log(e);
}
addOrReplaceHeader(self.RequestHeaders, "authorization", "Bearer " + accessToken);
//不存在token时点击获取按钮获取token
$("#getmsg").hide();
$("#btngettk").click(function () {
$("#getmsg").show();
$.ajax({
url: '/api/token',
type: 'post',
data: {
"grant_type": "client_credentials",
"client_id": $("#txtusername").val(),
"client_secret": $("#txtpwd").val()
},
dataType: "json",
success: function (data) {
var headers = self.RequestHeaders;
var accessToken = data.access_token;
$.cookie("token", accessToken, { path: "/", expires: });
addOrReplaceHeader(headers, "authorization", "Bearer " + accessToken);
$("#getmsg").hide();
}
}); })
本系列使用记录到此,有用到的再补充,有不对的地方希望大家帮忙指正修改,感谢!
Web API使用记录系列(四)OAuth授权与身份校验的更多相关文章
- Web API使用记录系列(一)创建API项目与基本配置
本系列文章主要记录Web API使用过程中的一些个人总结,包括创建API项目.基础配置.ApiTestClient使用与HelpPage页面的优化.Owin与OAuth的使用等. 本节主要内容是API ...
- Web API使用记录系列(二)HelpPage优化与WebApiTestClient
继续使用记录的第二节,HelpPage的优化与测试工具WebApiTestClient的使用. 之前没怎么整理博客,都是记录一下笔记,真正好好整理发现没想像的那么简单.不管怎么说还是培养下写博客的习惯 ...
- Web API使用记录系列(三)Web API与Owin
还好在坚持,今天继续更新第三篇随笔----使用owin来启动WebAPI(这里还是以IIS为宿主,当然也可以使用别的如Console.Windows Server等) 关于OWIN(Open Web ...
- 在ASP.NET Web API 2中使用Owin OAuth 刷新令牌(示例代码)
在上篇文章介绍了Web Api中使用令牌进行授权的后端实现方法,基于WebApi2和OWIN OAuth实现了获取access token,使用token访问需授权的资源信息.本文将介绍在Web Ap ...
- Web API在OWIN下实现OAuth
OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...
- [ASP.NET] 结合Web API在OWIN下实现OAuth
OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...
- Asp.Net Web API 2第十四课——Content Negotiation(内容协商)
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...
- [Web API] Web API 2 深入系列(7) Model绑定(下)
目录 ModelBinder ModelBinderProvider 不同类型的Model绑定 简单类型 复杂类型 其他类型 ModelBinder ModelBinder是Model绑定的核心. p ...
- [Web API] Web API 2 深入系列(6) Model绑定(上)
目录 解决什么问题 Model元数据解析 复杂类型 ValueProvider ValueProviderFactory 解决什么问题 Model: Action方法上的参数 Model绑定: 对Ac ...
随机推荐
- OC 01 类和对象
一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实 ...
- lsb_release查看当前系统的发行版信息
Linux除了用uname -r查看系统版本信息外,还可以用lsb_release. 安装: yum install -y redhat-lsb-core 使用: lsb_release -a
- 理解rest架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- log4j日志相对路径,Tomcat(第三方和Springboot内置)参数catalina.home和catalina.base的设置
关于Log4j日志相对路径的配置请看:log4j 产生的日志位置设置 和 catalina.home.catalina.base . 由于我们在Log4j的配置中引入了系统属性${catalina.b ...
- Foreach与迭代器
Foreach与迭代器 Foreach语句可以用于数组和集合的遍历.之所以能够工作,是因为Java SE5引入了新的被称为Iterable的接口,该接口中包含一个能够产生Iterator的iterat ...
- hdu 3078(LCA的在线算法)
Network Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- ofbiz之entity实体写法
实体定义文件 实体定义文件一般存放位置是在对应模块的entity文件夹下面,以party为例,party的实体定义文件路径为 %ofbiz-home%\applications\party\enti ...
- Qtp测试中的密码问题
Qtp中,一般录制的脚本进行回放的时候就会遇到各种各样的问题,导致回放不能顺利进行,比如这次我在录制一个简单的登陆脚本的时候,就遇到了这样的问题: [遇到问题] 1, 录制好的脚本中的密码不能正常输 ...
- 【初探移动前端开发】jQuery Mobile 二
本文例子请使用手机查看 List列表 在移动设备平台下,由于移动设备屏幕比较小,我们又是用手在上面点击的触屏方式,传统的列表模式在手机上就不太友好了. 虽然HTML5与CSS3提供了强大的界面实现方案 ...
- 转:Python安全 - 从SSRF到命令执行惨案
转:https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html Python安全 - 从SSRF到命令执行惨案 PH ...