关键词:
呼,开干第四篇,基于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,代码如下:
1 public partial class StartUp 2 3 /// <summary> 4 /// OAuth配置 5 /// </summary> 6 /// <param name="app"></param> 7 public void ConfigureAuth(IAppBuilder app) 8 9 app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 10 11 AllowInsecureHttp = true, 12 TokenEndpointPath = new PathString("/api/token"),//授权地址 13 AccessTokenExpireTimeSpan = TimeSpan.FromHours(24), //过期时间 14 AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 15 Provider = new SampleAuthorizationServerProvider() //授权服务 16 ); 17 18
SampleAuthorizationServerProvider是提供授权服务的方法,继承自OAuthAuthorizationServerProvider,包含客户端认证和用户名密码认证,代码如下
1 /// <summary> 2 /// 授权服务 3 /// </summary> 4 public class SampleAuthorizationServerProvider : OAuthAuthorizationServerProvider 5 6 #region 客户端授权 7 /// <summary> 8 /// 客户端验证 9 /// </summary> 10 /// <param name="context"></param> 11 /// <returns></returns> 12 public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 13 14 string clientId = ""; 15 string clientSecret = ""; 16 //获取传入的客户端id和客户端校验码 17 context.TryGetFormCredentials(out clientId, out clientSecret); 18 if (clientId == "发放的客户端id" && clientSecret == "发放的客户端校验码") 19 20 context.Validated(clientId); 21 22 else 23 24 context.SetError("invalid_client", "client is not valid"); 25 26 return base.ValidateClientAuthentication(context); 27 28 29 /// <summary> 30 /// 客户端授权-生成access token 31 /// </summary> 32 /// <param name="context"></param> 33 /// <returns></returns> 34 public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context) 35 36 var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType); 37 oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, "app"));//可以继续加一些其它信息 38 var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties() AllowRefresh = false ); 39 context.Validated(ticket); 40 return base.GrantClientCredentials(context); 41 42 #endregion 43 44 #region 用户名密码授权 45 public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 46 47 if (context.UserName == "用户名" && context.Password == "用户密码") 48 49 var props = new AuthenticationProperties(new Dictionary<string, string> 50 51 52 "userName", context.UserName 53 54 ); 55 var identity = new ClaimsIdentity("userinfo"); 56 identity.AddClaim(new Claim("DisplayName", "张三")); 57 identity.AddClaim(new Claim("DutyName", "总监")); 58 59 var ticket = new AuthenticationTicket(identity, props); 60 61 context.Validated(ticket); 62 63 else 64 65 context.SetError("invalid_user", "username or password error"); 66 67 return base.GrantResourceOwnerCredentials(context); 68 69 #endregion 70 71
在根目录App_Start中增加 ConfigureAuth(app);
请求Token(以客户端验证为示例)
1 $.ajax( 2 url: ‘/api/token‘, 3 type: ‘post‘, 4 data: 5 "grant_type": "client_credentials", 6 "client_id": $("#clientid").val(), 7 "client_secret": $("#clientscuret").val() 8 , 9 dataType: "json", 10 success: function (data) 11 var accessToken = data.access_token; 12 console.log("获取到的token:"+accessToken); 13 14 );
三、身份认证与身份认证失败自定义返回
增加身份认证,只需要在需要使用的controller上增加 特性 [Authorize]
不需要启用验证的使用特性 [AllowAnonymous]
认证失败返回401,但为了和我们项目的返回数据结构一致,我们需要在认证失败的时候修改返回,新建过滤器继承AuthorizeAttribute,完事将使用Authorized的地方替换为自定义的过滤器
1 public class CustomAuthorizeAttribute:AuthorizeAttribute 2 3 protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 4 5 base.HandleUnauthorizedRequest(actionContext); 6 actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.OK) 7 8 Content = new StringContent("项目返回的数据格式数据") 9 ; 10 11
四、TestClient
为了方便在线测试接口添加token的方便,我们需要给弹出的调用窗口增加authorization的header信息、获取token的操作;并将获取到的token存储到cookie,打开窗口时存在自填充,省去每次的获取操作
》文件TestClientDialogs文件,在<div class="panel"> 内添加如下代码
1 <div style="margin-bottom:10px;background:#EFEFEF;border:1px solid #ccc;padding:10px"> 2 <div> 3 客户端id: 4 <input type="text" id="clientid" value="admin" /> 5 客户端securet: 6 <input type="password" id="clinetsecuret" value="admin" /> 7 <a href=‘javascript:;‘ id="btngettk">获取 Token</a> 8 </div> 9 <div style="padding:5px;background:#ffd800;" id="getmsg"> <span> 正在获取Token,请稍后...</span></div> 10 </div> 11 12 <hr />
》WebApiTestClient.js中修改如下(TestClientViewModel方法末尾添加):
1 //支持弹出窗口自动填充token 2 var accessToken; 3 try 4 accessToken = $.cookie("token"); 5 catch (e) 6 console.log(e); 7 8 addOrReplaceHeader(self.RequestHeaders, "authorization", "Bearer " + accessToken); 9 //不存在token时点击获取按钮获取token 10 $("#getmsg").hide(); 11 $("#btngettk").click(function () 12 $("#getmsg").show(); 13 $.ajax( 14 url: ‘/api/token‘, 15 type: ‘post‘, 16 data: 17 "grant_type": "client_credentials", 18 "client_id": $("#txtusername").val(), 19 "client_secret": $("#txtpwd").val() 20 , 21 dataType: "json", 22 success: function (data) 23 var headers = self.RequestHeaders; 24 var accessToken = data.access_token; 25 $.cookie("token", accessToken, path: "/", expires: 1 ); 26 addOrReplaceHeader(headers, "authorization", "Bearer " + accessToken); 27 $("#getmsg").hide(); 28 29 ); 30 31 )
本系列使用记录到此,有用到的再补充,有不对的地方希望大家帮忙指正修改,感谢!
授权角色 WebAPI oauth owin
】授权角色WebAPIoauthowin【英文标题】:AuthorizationrolesWebAPIoauthowin【发布时间】:2014-10-2823:24:45【问题描述】:我使用OWIN中间件在ASP.NETWebAPI上实现了令牌授权系统。我可以成功地通过REST客户端进行身份验证并获得一个授权令牌来... 查看详情
OAuth 授权与身份验证
】OAuth授权与身份验证【英文标题】:OAuthAuthorizationvsAuthentication【发布时间】:2016-02-1515:07:00【问题描述】:OAuth术语已经困扰我很久了。是像某些人建议的那样进行OAuth授权还是身份验证?如果我错了,请纠正我,但我一直将... 查看详情
oidc-基于oauth2的下一代身份认证授权协议
...一个授权(authorization)的开发协议,在全世界得到广泛使用,但在实际使用中,OAuth2只解决了授权问题,没有实现认证部分,往往需要添加额外的API来实现认证;而OpenID呢,是一个认证(authentication)的协议,二者在实际使用过... 查看详情
oauth 隐式授权与授权码授权?
】oauth隐式授权与授权码授权?【英文标题】:oauthimplicitgrantvsauthorizationcodegrant?【发布时间】:2018-11-2118:02:56【问题描述】:我想更好地理解隐式授权流程和授权代码授权流程之间的区别,因为我不确定我目前的理解是否正确。... 查看详情
使用微服务架构思想,设计部署oauth2.0授权认证框架(代码片段)
...系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是这些WebAPI并不在一台服务器上,甚至可能是第三方提供的WebAPI。同时处于系统安全的架构设计,后端WebAPI是不能直接暴露在外面的;另一方面,我们这个新产品... 查看详情
OAuth 2 将服务器-服务器 API 调用的身份验证与授权分开
】OAuth2将服务器-服务器API调用的身份验证与授权分开【英文标题】:OAuth2separateauthenticationfromauthorizationforserver-serverAPIcalls【发布时间】:2019-01-0804:35:19【问题描述】:上下文我正在尝试为我们公司的产品设计一个具有以下三个... 查看详情
如何在 Azure 逻辑应用中使用 OAuth 2.0 身份验证?
...在Azure中托管并使用OAuth2.0客户端凭据授权流进行保护的WebAPI。如何在逻辑应用中配置OAuth 查看详情
webapi登录身份验证
...Action的权限验证来实现Web系统登录,Mvc前端权限校验以及WebApi服务端的访问校验功能。 1.WebForm认证介绍Web应用的访问方式因为是基于浏览器的Http地址请求,所以需要验证用户身份的合 查看详情
如何从 OAuth 客户端凭据开始使用 OWIN Oauth 保护 WebApi?
】如何从OAuth客户端凭据开始使用OWINOauth保护WebApi?【英文标题】:HowtostartwithOAuthClientCredentialstoprotectWebApiusingOWINOauth?【发布时间】:2014-07-0701:49:51【问题描述】:我是OAuth2.0的新手。我仔细阅读了OAuth2.0doc,发现有四种获取授权... 查看详情
使用 OAuth2/OpenId Connect 和微服务进行身份验证和授权
】使用OAuth2/OpenIdConnect和微服务进行身份验证和授权【英文标题】:AuthenticationandauthorizationwithOAuth2/OpenIdConnectandmicroservices【发布时间】:2017-12-1701:15:51【问题描述】:我尝试将Oauth2/OpenIdConnect实现到基于Java/SpringCloud的微服务架构... 查看详情
使用 AngularJS、WebAPI 2 和 Oauth 2 时,如何将授权信息发送回我的客户端应用程序?
】使用AngularJS、WebAPI2和Oauth2时,如何将授权信息发送回我的客户端应用程序?【英文标题】:HowcanIsendauthorizationinformationbacktomyclientappwhenusingAngularJS,WebAPI2andOauth2?【发布时间】:2014-07-0705:44:02【问题描述】:我有一个AngularJS客户... 查看详情
基于 JWT 的身份验证/授权与 Microsoft Identity 2
...时间】:2019-01-1810:21:58【问题描述】:我有一个AngularJS/WebAPI/SQLServer应用程序,该应用程序当前使用基于令牌的身份验证和授权,使用下面概述的文章:JSONWebTokeninASP.NETWebA 查看详情
在 REST 微服务上使用 Zuul Proxy、Oauth2 实现身份验证和授权
】在REST微服务上使用ZuulProxy、Oauth2实现身份验证和授权【英文标题】:ImplementingauthenticationandauthorizationusingZuulProxy,Oauth2onRESTMicroservices【发布时间】:2019-06-1708:06:51【问题描述】:我正在尝试使用SpringBoot在工作流中实现上述架构... 查看详情
使用 JWT 令牌实现身份验证和授权
】使用JWT令牌实现身份验证和授权【英文标题】:implementingauthenticationandauthorizationusingJWTtoken【发布时间】:2017-12-1017:58:47【问题描述】:我只是混淆使用UseJwtBearerAuthentication或JWT和OAUTH2在.NetCoreWebAPI中实现身份验证和授权。【问... 查看详情
使用 JWT 的 Oauth 2.0 授权
...间】:2017-07-2311:58:31【问题描述】:我正在使用JWT令牌在webapi2授权中实现,我是这个领域的新手。我坚持生成AudienceId和AudienceSecret为什么我需要它们的目的?【问题讨论】:【参考方案1】:从OAuth的角度来看,令牌是不透明的... 查看详情
使用 Spring Security OAuth2 Login 进行身份验证时,用户返回到授权 URI
】使用SpringSecurityOAuth2Login进行身份验证时,用户返回到授权URI【英文标题】:UsergoesbacktoauthorizationURIwhenauthenticatedwithSpringSecurityOAuth2Login【发布时间】:2021-06-2202:26:32【问题描述】:我正在使用SpringSecurityOAuth2Login来验证具有Facebo... 查看详情
GAPI 的 OAuth - 初始登录 Javascript 后避免身份验证和授权
...个chrome扩展程序,它可以读取电子邮件、执行某些操作并使用google客户端APIforjavascript创建任务。 查看详情
使用 oAuth 对 javascript 小部件进行身份验证
】使用oAuth对javascript小部件进行身份验证【英文标题】:AuthenticatingjavascriptwidgetusingoAuth【发布时间】:2012-11-2615:48:32【问题描述】:我正在构建一项营销服务,我们在其中为各种公司提供小部件以将其托管在他们的网站上。这... 查看详情