ASP.NET MVC WebApi接口授权验证

ASP.NET MVC WebApi接口授权验证

对于很多开发者来说,不管是使用任何一种框架,或者是使用任何一种语言,都要使用面向接口编程。使用面向接口编程的时候,就会有很多的权限验证,用户验证等等。

特别是对于一些系统来说,别人想要对接你的系统,同步系统数据,那么就必须要提供对外访问接口。当然,这对外接口也不是随便就提供的,对于一些机密数据,那么对于别人想要使用你的数据,就必须按照一个标准来。我系统对外提供接口,想要用这个接口必须要通过身份认证才行。举个例子:你想去我家,你必须经过我的同意和我给你的钥匙你才可以进去。在程序中,接口也是这个道理。有的接口也要通过身份认证,专业一点的说法就是token验证。

最近我就遇到了要写对外接口给别人的一个任务,使用的开发语言是C#,不管使用的是任何语言,实现的原理都是一样的。在ASP.NET MVC 上,webapi是用来写接口最佳利器。

接下来是我写了一个简单的接口授权验证的实例

public class AuthFilterAttribute : Attribute, IAuthenticationFilter

   {

       /// <summary>

       /// AllowMultiple

       /// </summary>

       public bool AllowMultiple => true;

       /// <summary>

       /// 登录授权验证

       /// </summary>

       /// <param name="context"></param>

       /// <param name="cancellationToken"></param>

       /// <returns></returns>

       public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)

       {

           try

           {

               var authHeader = context.Request.Headers.Authorization;

 

               if (authHeader != null && authHeader.Scheme == TokenAuthentication.Scheme)

               {

                   var Parameter = authHeader.Parameter;

                   if (!string.IsNullOrEmpty(Parameter) && Parameter != "null" && Parameter != "undefined")

                   {

                       var x = TokenAuthentication.DecryptUserInfo(Parameter);

                       //用户名登录验证

                       bool result = xx类.xxx方法(x.UserName, x.secretKey);//这里是验证接口用户的地方,token是放在请求头里面里面用加密方式转过了的

 

                       if (result)

                       {

                           // 接口用户已授权认证通过  这里是对webapi里面的接口方法进行授权验证,后台控制用户只能访问接口中指定的接口方法。

                           var claims = new List<Claim>();

                           claims.Add(new Claim(ClaimTypes.Name, x.secretKey));

                           var data = JsonConvert.SerializeObject(sp_portuserjurisdictionbll.AuthorizeList(x.secretKey));

                           JArray jObject = JArray.Parse(data);

                           foreach (JObject jProperty in jObject)

                           {

                               //添加接口方法权限

                               claims.Add(new Claim(ClaimTypes.Role, jProperty["authorizename"].ToString()));

                           }

                           var token = new ClaimsIdentity(claims, TokenAuthentication.Scheme);

                           context.Principal = new ClaimsPrincipal(new ClaimsIdentity[] { token });

                       }

                   }

               }

 

           }

           catch (Exception e)

           {

               throw e;

           }

           return Task.FromResult(0);

       }

 

       /// <summary>

       /// 质询

       /// </summary>

       /// <param name="context"></param>

       /// <param name="cancellationToken"></param>

       /// <returns></returns>

       public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)

       {

           return Task.FromResult(0);

       }

   }

 

接下来就是把验证放到webapi控制器里面了

[AuthFilter]//用户验证 这个就是什么的接口用户验证

    [RoutePrefix("api/xxxx")]

    public class xxxController : ApiController

    {

       /// <summary>

        /// 查询学生基本信息接口

        /// </summary>

        /// <param name="model">查询参数实体</param>

        /// <returns></returns>

        [HttpGet]

        [Authorize(Roles = "StudentTable-GetStudengMessage")]  //接口授权验证 claims  里面包含了"StudentTable-GetStudengMessage"这个的值,那么这个接口方法就可以调用

        [Route("")]

        public 学生信息实体 FindStudent([FromUri] Parameter model) {

         return xxx.FindStudent(model.name, model.age);

        }

   }  

 一定要在webapiconfig.cs Register 方法里面加上 接口身份认证筛选器

// 身份认证筛选器。

  config.Filters.Add(new AuthFilterAttribute()); //接口认证类

  一个简单的接口身份认证,接口方法访问权限就已经做好了。

博客 https://www.cnblogs.com/jiangxifanzhouyudu/p/8735650.html

 

webapi身份认证和授权

我要做一个api服务,给公司的各个业务系统使用,但是接口要加个身份认证,只有我这边同意过的系统才能调用我的接口。
身份认证和授权的相关知识点,得出如下一个思路:
使用token进行认证和授权操作
(1)用户使用用户名密码来请求服务器
(2)服务器进行验证用户的信息服务器,通过验证发送给用户一个token
(3)客户端存储token,并在每次请求时带上这个token值到服务端验证token值,并返回数据
(4)这个token必须要在每次请求时传递给服务端,它应该保存在请求头里

但是我现在有个问题是,如果这套用户名和密码是我告诉各个业务子系统的话,那我为什么不直接给他们指定一个token?
如果我给他们用户名和密码,他们通过用户名和密码来请求我的认证接口获得token,再来请求业务api的话,那他们每次请求业务api的时候就会有个定期请求token的过程,假如是token过期,他们的逻辑里还得有个重新请求token,再重新请求接口的过程,这样好像很撇脚。
最后一方面,如果是我给他们提供一个注册页面,通过他们注册我来审核这样分配用户名和密码的话,第一个问题就没有了,那就是需要解决第二个问题。
现在有点乱,因为之前没搞过认证授权。网上看到的需要使用认证授权的场景和我的场景不太符合,因为我这只有两个关系,一个api服务,一个业务系统,没有别的了。是不是我想问题复杂化了

 

问题补充:

我目前做了一个demo,是参照这个案例做的,https://www.cnblogs.com/lnice/p/6857203.html
流程都是通的,但是在第二个问题上有点纠结。

最佳答案: 关于第二个问题,每次请求token的问题,这个可以在业务系统里,定期更新token,使token一直都是最新的,不过期的,这样就不撇脚了。
另,如何设计看自己了,复杂点可以分离出一个认证授权服务,简单点就api端给web端指定一个token。

其他回答一: 我、微信、第三方应用,是三个对象,我在访问第三方资源时通过微信授权,账号密码在微信这里,访问第三方通过微信给的token去访问,这样的机制好处是我不用告诉第三方我的微信账号和密码是什么。
而我现在项目的场景里,只有我(业务系统)、第三方应用(我的api服务),少了一个微信(认证授权的地方),目前我的demo里把认证和授权写在api这边了,所以我就觉得很撇脚,相当于是api负责了两个角色,资源拥有者和认证授权者,
不过我好像也逐渐明白了什么,我没有把认证授权分出去作为一个服务。不过我这里做的api服务基本都是自己公司在用,再去搞一套认证授权服务是不是有点多余?

 

其他回答二:公司内部的api,不建议增加鉴权。假设要暴露出去服务,应该由统一的网关干这个事情。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值