webapi使用记录系列oauth授权与身份校验(代码片段)

xihao xihao     2022-12-04     577

关键词:

  呼,开干第四篇,基于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【问题描述】:我正在构建一项营销服务,我们在其中为各种公司提供小部件以将其托管在他们的网站上。这... 查看详情