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 ...
随机推荐
- c语言简单实现telnet客户端
c语言简单实现telnet客户端 http://blog.csdn.net/haiwenchen/article/details/69944118
- OpenCV编程入门目录
第一部分 快速上手OpenCV 第1 章 邂逅OpenCV 图像处理.计算机视觉与OpenCV OpenCV 概述 起源及发展 应用概述 .2OpenCV 基本架构分析 .3OpenCV3 带来了什么 ...
- strtok的用法(文件操作)
strtok :在一个字符串查找下一个符号 char *strtok( char *strToken, const char *strDelimit ); 返回值:返回指向在strToken字符串找到 ...
- leetcode 之Reverse Linked List II(15)
这题用需要非常细心,用头插法移动需要考虑先移动哪个,只需三个指针即可. ListNode *reverseList(ListNode *head, int m, int n) { ListNode d ...
- 3.22. grep sed re
1.整理正则表达式博客 re http://www.cnblogs.com/oyoui/p/6599846.html 2.grep(正则表达式及字符处理) 1.显示出所有含有root的行: [roo ...
- transition结合:after,:before实现动画
div代码 <div class='div'> hover </div> css代码 .div{ width:200px; height:100px; line-height: ...
- OFBIZ 10.04 开发环境搭建(ofbiz+mysql+eclipse)
1.下载安装 JDK1.6,并设置环境变量 在“我的电脑”上点右键—>“属性”—>“高级”—> “环境变量(N)”. 新建系统变量JAVA_HOME:C:Program Fil ...
- WP评论系统更换小结(转)
第三方评论插件 多说 多说是一款追求极致体验的社会化评论框,可以用微博.QQ.人人.豆瓣等帐号登录并评论. 多说具备优质用户体验.速度和稳定性.社会化推荐.建站程序审核整合.垃圾评论过滤等特性. 自定 ...
- Windows10 Docker加速
参考地址:https://blog.csdn.net/wanderlustlee/article/details/80216588 在刚开始使用时,有可能因为网络的问题导致整个镜像的下载过程不是太顺畅 ...
- 如何让js在最后执行
$(window).bind("load", function () { var height = $(document.body).height(); $('.syntaxhig ...