呼,开干第四篇,基于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授权与身份校验的更多相关文章

  1. Web API使用记录系列(一)创建API项目与基本配置

    本系列文章主要记录Web API使用过程中的一些个人总结,包括创建API项目.基础配置.ApiTestClient使用与HelpPage页面的优化.Owin与OAuth的使用等. 本节主要内容是API ...

  2. Web API使用记录系列(二)HelpPage优化与WebApiTestClient

    继续使用记录的第二节,HelpPage的优化与测试工具WebApiTestClient的使用. 之前没怎么整理博客,都是记录一下笔记,真正好好整理发现没想像的那么简单.不管怎么说还是培养下写博客的习惯 ...

  3. Web API使用记录系列(三)Web API与Owin

    还好在坚持,今天继续更新第三篇随笔----使用owin来启动WebAPI(这里还是以IIS为宿主,当然也可以使用别的如Console.Windows Server等) 关于OWIN(Open Web ...

  4. 在ASP.NET Web API 2中使用Owin OAuth 刷新令牌(示例代码)

    在上篇文章介绍了Web Api中使用令牌进行授权的后端实现方法,基于WebApi2和OWIN OAuth实现了获取access token,使用token访问需授权的资源信息.本文将介绍在Web Ap ...

  5. Web API在OWIN下实现OAuth

    OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...

  6. [ASP.NET] 结合Web API在OWIN下实现OAuth

    OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...

  7. Asp.Net Web API 2第十四课——Content Negotiation(内容协商)

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  8. [Web API] Web API 2 深入系列(7) Model绑定(下)

    目录 ModelBinder ModelBinderProvider 不同类型的Model绑定 简单类型 复杂类型 其他类型 ModelBinder ModelBinder是Model绑定的核心. p ...

  9. [Web API] Web API 2 深入系列(6) Model绑定(上)

    目录 解决什么问题 Model元数据解析 复杂类型 ValueProvider ValueProviderFactory 解决什么问题 Model: Action方法上的参数 Model绑定: 对Ac ...

随机推荐

  1. 很重要的处理项目url[www]

    http://www.xdowns.com/soft/10/57/2013/Soft_113319.html https://github.com/TricksterGuy/Morphan http: ...

  2. C#利用WinRAR实现压缩和解压缩

    using System; using Microsoft.Win32; using System.Diagnostics; using System.IO; namespace MSCL { /// ...

  3. 零基础学php的自学

    我们都知道,php语言作为一种专业建站的语言,没有华而不实,而是经受住了时间考验,成为一种值得学习的语言.现在国内众多的php学校也说明,php语言在当今有着广泛的市场需求. 那么零基础的同学如何学习 ...

  4. tomcat远程调试参数备忘

    tomcat远程调试,启动时添加参数: -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,ser ...

  5. 第一次用python编写的小程序

    print ("*******数字游戏*********")temp = input ("猜猜小红现在心里想的是什么数字呢?")guess = int(temp ...

  6. git 查看父分支

    // 显示本地分支和服务器分支的映射关系 git branch -vv // 切换分支(和创建分支就差一个-b参数) git checkout {{branch_name}} // 创建新分支,新分支 ...

  7. redis之(一)redis的简单介绍

    [一]:概念 --->Redis是一个开源的,高性能的,基于键值对的缓存与存储系统 --->Redis数据库中的多有数据都存储在内存中,由于内存的读写速度远快于硬盘,一秒读写超过10万键值 ...

  8. hdu 1065(贪心)

    Wooden Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20938   Accepted: 8872 De ...

  9. hdu 1325(并查集)

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. "GrabCut" - Interactive Foreground Extraction using Iter

    转载自:http://blog.csdn.net/zouxy09/article/details/8534954 有源代码的博客:http://www.cnblogs.com/xrwang/archi ...