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

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

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

ASP.NET MVC WebApi接口授权验证的更多相关文章

  1. ASP.NET Core WebApi基于JWT实现接口授权验证

    一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...

  2. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  3. 七天学会ASP.NET MVC (四)——用户授权认证问题

    小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验 ...

  4. ASP.NET MVC学习之模型验证篇

    一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们.慢慢的已经在博客园中度过一年半了,伊始只是将博客园作为自己学习的记录本一样使用,也不敢将自己的随笔发表到博客园首页,生怕自己的技艺不高,反 ...

  5. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

    ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttr ...

  6. .net异步性能测试(包括ASP.NET MVC WebAPI异步方法)

    很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.Net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语 ...

  7. 【ASP.NET MVC系列】数据验证和注解

    [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...

  8. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  9. 案例:1 Ionic Framework+AngularJS+ASP.NET MVC WebApi Jsonp 移动开发

    落叶的庭院扫的一干二净之后,还要轻轻把树摇一下,抖落几片叶子,这才是Wabi Sabi的境界. 介绍:Ionic是移动框架,angularjs这就不用说了,ASP.Net MVC WebApi提供数据 ...

随机推荐

  1. Confluence 5.4.2安装

    默认安装路径 /opt/atlassian/confluence/bin Confluence是Atlassian公司出品的团队协同与知识管理工具. Confluence是一个专业的企业知识管理与协同 ...

  2. [Cpp primer] range for (c++11)

    for (declaration : expression) statement; /* This statement will iterate through the elements in the ...

  3. Python handling an exception

    #try...except... try: You do your operations here; ...................... except ExceptionI: If ther ...

  4. 象棋AI算法(二)

    原文大神是用html5+js写的关于象棋AI的博客,里面重点讲了棋子的着法,自己设计的评估函数和简单的Minmax理论,没有具体的讲搜索算法,本文是对原文的学习和分析补充 一,棋子的着法com.byl ...

  5. Windbg基本命令应用总结

    .cordll -ve -u -l //reload core dlls ------加载下载系统文件符号的URL---------- .sympath SRV*C:\Symbols*http://m ...

  6. 一个进程间同步和通讯的 C# 框架

    转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB    下载 threadmsg_src.zip ~ 65KB    下载 0.背景简介 微软在 .NE ...

  7. **字符串格式化:%和.format

    字符串格式化:%和.format .format在许多方面看起来更便利.对于%最烦人的是它无法同时传递一个变量和元组.你可能会想下面的代码不会有什么问题: "hi there %s" ...

  8. iOS学习之UIPickerView控件的简单使用

    UIPickerView控件在给用户选择某些特定的数据时经常使用到,这里演示一个简单的选择数据,显示在UITextField输入框里,把UIPickerView作为输入View,用Toolbar作为选 ...

  9. python's metaclass

    [python's metaclass] 和objc中类似,metaclass用于创建一个类对象,但与objc不同的是,objc中每个类对象有各自不同的metaclass,而python中的metac ...

  10. 《Head First 设计模式》观后感——专业并不一定是深奥和枯燥

    <Head First 设计模式>观后感——专业并不一定是深奥和枯燥 说起设计模式,我想做程序的朋友都不会感到陌生,这就像是软件里的缩写一样,可以快速的表达一系列的意思. 但是纵观市面上的 ...