需要使用WEBAPI,但是有验证问题没解决.后来参考网上文章做了一下DEMO

思路:

  就是根据用户的账号在服务端加密一个字符串,然后返回给用户端.

具体:

  1. 用户ID唯一身份标识,用户密码.首次登录服务器.
  2. 服务端收到编号和密码后,验证登录.如果成功则生成TOKEN
  3. 将用户ID使用AES加密,放到数据库.计下时间2小时过期.然后返回加密后的16位字符编码(TOKEN)到客户端.
  4. 客端请求接口时在header里带上这个TOKEN.
  5. 服务端收到请求,验证TOKEN:是否存在,是否过期,解密后比对用户编号等等.

实现:

  使用了AuthorizeAttribute特性,实现了它的部分方法完成验证步骤.然后再webapi控制器的方法上贴上这个标记.

  这个类实现WEBAPI的验证特性.贴上这个特性之后,就会验证授权.在MVC里也有同样的东西.但是它们不在同一个命名空间.WEB API 是这个空间System.Web.Http
  参考地址
    https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(System.Web.Http.AuthorizeAttribute);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true
  参考实现代码地址
  http://www.cnblogs.com/landeanfen/archive/2016/03/24/5287064.html

关键代码和细节:

  

// 实现这个特性,并且重写几个方法
public class ApiAuthorize: AuthorizeAttribute
{
// 操作授权时会调用此方法,这是完成验证的关键方法
public override void OnAuthorization(HttpActionContext actionContext)
{
/*
* Authorization 这个属性有值,是因为客户端传来了.而且传参的格式如下:
* 'Authorization':'Basic token',键就是属性名字.值要加上Basic前缀,即"http基本验证"
*/
// 获取请求头里的验证信息
var authorization = actionContext.Request.Headers.Authorization;
// 如果有,且参数也有.说明可能验证过的
if ((authorization != null) && (authorization.Parameter != null))
{
// 校验用户名密码是否匹配
string encryptTicket = authorization.Parameter;
// 成功则调用基类的验证是否登录方法
if (ValidateTicket(encryptTicket))
{
base.IsAuthorized(actionContext);
}
else
{
// 失败则调用失败时处理方法
HandleUnauthorizedRequest(actionContext);
}
}
//如果取不到身份验证信息,调用失败请求处理方法
else
{
HandleUnauthorizedRequest(actionContext);
}
}
// 这个方法 会在验证失败时调用,可以设定返回状态值和返回信息.
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
base.HandleUnauthorizedRequest(actionContext);
var response = actionContext.Response = actionContext.Response ?? new System.Net.Http.HttpResponseMessage();
// 这句话可以改变请求状态值 就是 200 403 之类的那个状态值
response.StatusCode = System.Net.HttpStatusCode.OK;
// 将这个出错信息加入到返回对象中.
response.Content = new System.Net.Http.StringContent
(System.Web.Helpers.Json.Encode(new { status = "", msg = "身份验证出错!"}), System.Text.Encoding.UTF8, "application/json");
}
// 这个方法验证TOKEN的有效性
private bool ValidateTicket(string token)
{
// 目前实现办法是,将每次请求的用户编号,token信息放到数据库中.
// 每登录一次,记录当时的用户编号,GUID,密钥,生成时间,过期时间,TOKEN.
// 然后每次请求接口时,查询这些数据,成功则表示通过验证
}
}

调用:

  在api控制器上贴上这个标记

  [ApiAuthorize]
  public object Get()

  {return new { status = "1", msg = "你已经通过验证", data = new { a = 1, b = 2, c = 3 } };}

  // 向这个API发请求,(JQUERY版本是jquery-1.10.2.min.js)

var token="eufjd93j49013jlk21jK9dfj13j32932jjdfk92130123j13jeqpwe123fdjsde3";

  $.ajax({
      type: "GET",

      url: "/api/get",

      headers: { 'Authorization':'Basic '+ token).val() },// 这里要加上Basic前缀.表示"http基本身份验证",不然,服务端接的authorization.Parameter参数始终是NULL

      dataType: 'json',

      success: function (result) {}

  });

web api简单验证实现办法的更多相关文章

  1. .net web api 权限验证

    做一个登录权限验证. 开始吧. using System; using System.Collections.Generic; using System.Drawing; using System.D ...

  2. asp.net Web API 身份验证 不记名令牌验证 Bearer Token Authentication 简单实现

    1. Startup.Auth.cs文件 添加属性 1 public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; ...

  3. ASP.NET Web API身份验证和授权

    英语原文地址:http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-a ...

  4. 基于JWT的web api身份验证及跨域调用实践

    随着多终端的出现,越来越多的站点通过web api restful的形式对外提供服务,很多网站也采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于cookie的Session Id的 ...

  5. ASP.NET Web API 安全验证之摘要(Digest)认证

    在基本认证的方式中,主要的安全问题来自于用户信息的明文传输,而在摘要认证中,主要通过一些手段避免了此问题,大大增加了安全性. 1.客户端匿名的方式请求 (无认证) HTTP/ Unauthorized ...

  6. Web API 身份验证 不记名令牌验证 Bearer Token Authentication

    1. Startup.Auth.cs文件 添加属性 public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; p ...

  7. Web API 简单示例

    一.RESTful和Web API Representational State Transfer (REST) is a software architecture style consisting ...

  8. ASP.NET Web API模型验证以及异常处理方式

    ASP.NET Web API的模型验证与ASP.NET MVC一样,都使用System.ComponentModel.DataAnnotations. 具体来说,比如有:[Required(Erro ...

  9. ASP.NET MVC 5 WEB API 用户验证

    参考博客:ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1) 参考博客:MVC WebApi 用户验证 (2)构建ASP.NET MVC5+E ...

随机推荐

  1. dedecms _ 栏目无法更新

    dedecms 后台_  栏目无法更新: 那天我在移站,  出现了这个问题 例如这样的提示: 遇到问题咱就得解决啊: 解决方法如下: 进入dedecms后台 进入----系统-----系统基本参数-- ...

  2. CSS - 针对不同浏览器的写法

    火狐浏览器: @-moz-document url-prefix() { /*这段区域的样式代码只在firefox起作用*/ .x{ width: 100px; height: 100px; back ...

  3. xcode5.1上真机调试报告No architectures to compile for...的解决办法

    由于手头上只有一台IPAD一代,近期升级到IOS5.0了(人家apple只让升级到此为止)而开发环境Xcode版本是5.1,默认情况下XCode编译出来的代码最低能跑在IOS6.0下, 于是GOOGL ...

  4. destoon系统商城加淘宝客按钮方法

    destoon系统很多喜欢运营B2B的站长都在用,其中的商城模块常常被用来做淘宝客,其中的难点是如何把购买按钮做成淘宝客地址,这个问题的修改在论坛上被叫价50元,下面小编把这个实用的方法分享下,希望对 ...

  5. LinkButton中添加删除确认框

    LinkButton1.Attributes.Add("onclick", "javascript:return confirml('确认删除?');");

  6. GO实例3 Slice append打印

    package main import "fmt" func main(){ ]int slice:=array[:] slice[]='a' slice[]='b' s1:=ap ...

  7. 『安全科普』HTTP协议讲解及手工模拟发送

    学习,熟悉HTTP协议,便于以后进行HTTP重放攻击! 0x 01 HTTP协议 查看HTTP协议 先查看鼠标点击一个链接后,浏览器发出了怎样的HTTP请求. Chrome浏览器下,按F12进入开发者 ...

  8. 减少leftJoin的使用 (转)

    作为开发,你是否经常碰到下面需要转换用户ID成用户名称的情况: 可惜你的这些业务表出于最少冗余设计要求,只有UserId,而没有UserName,这时你不得不破坏你一个类封装一个表的美好想法, 在你的 ...

  9. 算法导论(第三版)习题Exercises4.3(第四章三节)算法导论的一个印刷错误

    本节系列证明都可见4.5节需要说明的有4.3-8,4.3-9两题 4.3-8(本题有误) T(n)=4T(n/2)+n2根据4.5理论,结果为Θ(n2lgn) 4.3-9 m = lgn T(2m) ...

  10. c语言指针点滴1

    #include <stdio.h> #include <stdlib.h> void main() { int *p = NULL;//指针开始最好都初始化为空 if(p = ...