ASP.NET MVC WebApi接口授权验证

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class AuthFilterAttribute : Attribute, IAuthenticationFilter
{
///
/// AllowMultiple
///
public bool AllowMultiple => true;
///
/// 登录授权验证
///
///
///
///
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
{
///
/// 查询学生基本信息接口
///
/// 查询参数实体
///
[HttpGet]
[Authorize(Roles = “StudentTable-GetStudengMessage”)] //接口授权验证 claims 里面包含了"StudentTable-GetStudengMessage"这个的值,那么这个接口方法就可以调用
[Route("")]
public 学生信息实体 FindStudent([FromUri] Parameter model) {
return xxx.FindStudent(model.name, model.age);
}
}
复制代码
忘了一件事情

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

1
2
// 身份认证筛选器。
config.Filters.Add(new AuthFilterAttribute()); //刚刚写好的接口认证类
  一个简单的接口身份认证,接口方法访问权限就已经做好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值