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 ...
随机推荐
- 很重要的处理项目url[www]
http://www.xdowns.com/soft/10/57/2013/Soft_113319.html https://github.com/TricksterGuy/Morphan http: ...
- C#利用WinRAR实现压缩和解压缩
using System; using Microsoft.Win32; using System.Diagnostics; using System.IO; namespace MSCL { /// ...
- 零基础学php的自学
我们都知道,php语言作为一种专业建站的语言,没有华而不实,而是经受住了时间考验,成为一种值得学习的语言.现在国内众多的php学校也说明,php语言在当今有着广泛的市场需求. 那么零基础的同学如何学习 ...
- tomcat远程调试参数备忘
tomcat远程调试,启动时添加参数: -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,ser ...
- 第一次用python编写的小程序
print ("*******数字游戏*********")temp = input ("猜猜小红现在心里想的是什么数字呢?")guess = int(temp ...
- git 查看父分支
// 显示本地分支和服务器分支的映射关系 git branch -vv // 切换分支(和创建分支就差一个-b参数) git checkout {{branch_name}} // 创建新分支,新分支 ...
- redis之(一)redis的简单介绍
[一]:概念 --->Redis是一个开源的,高性能的,基于键值对的缓存与存储系统 --->Redis数据库中的多有数据都存储在内存中,由于内存的读写速度远快于硬盘,一秒读写超过10万键值 ...
- hdu 1065(贪心)
Wooden Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20938 Accepted: 8872 De ...
- hdu 1325(并查集)
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- "GrabCut" - Interactive Foreground Extraction using Iter
转载自:http://blog.csdn.net/zouxy09/article/details/8534954 有源代码的博客:http://www.cnblogs.com/xrwang/archi ...