.net web api 权限验证
做一个登录权限验证。
开始吧。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Security;
using Game.Web.Models; namespace Game.Web.ApiControllers
{
[Authorize.APIAuthorize]
[RoutePrefix("api/home")]
public class HomeController : BaseController
{
/// <summary>
/// 用户登录
/// </summary>
/// <returns></returns>
[Route("loginUser"), HttpPost, AllowAnonymous]
public AjaxJsonResult LoginUser(UserInfo info)
{
AjaxJsonResult ajax = new AjaxJsonResult() { code = (int)CodeStatus.NoLogin, msg = ajax.GetEnumDescription(CodeStatus.NoLogin) };
try
{
//调用登录方法
UserInfo _info = new UserInfo()
{
UserName = "aaa",
PassWord = ""
};
if (_info.UserName == info.UserName && _info.PassWord == info.PassWord)
{
//登录成功,添加票证
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( , $"UserToken"
, DateTime.Now
, DateTime.Now.AddMinutes()
, false
, $"{info.UserName}:{info.PassWord}"
, HttpContext.Current.Request.UserHostAddress);
string ticStr = FormsAuthentication.Encrypt(ticket);
ajax.code = (int)Models.CodeStatus.OK; ajax.msg = "登入成功!";
}
else
{
ajax.msg = "登入失败!";
}
}
catch (Exception ex)
{
LogHelper.Error("登录报错!", ex);
}
return ajax;
}
}
}
AllowAnonymous 特性 ,不需要验证
LogHelper 静态方法,这里用了Log4,进行错误日志记录,网上有自己百度哦。
这里只是简单的加入了票证,其实可以把它再加密成Token放到Response的Headers里面,具体这么操作自行百度吧。
登录成功后下面就是用API接口获取List数据拉。
不过在获取前,我们需要进行权限验证。using Game.Facade;
using Game.Utils.Cache;
using Game.Web.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Security; namespace Game.Web.Authorize
{
/// <summary>
/// web api 权限验证
/// </summary>
public class APIAuthorize : AuthorizeAttribute
{
private HttpContext _context { get; set; } /// <summary>
/// 管理员权限验证
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
public override void OnAuthorization(HttpActionContext httpContext)
{
//获取用户票证
if (ValidateTicket(httpContext))
{
base.IsAuthorized(httpContext);
}
else
{
HandleUnauthorizedRequest(httpContext);
}
} /// <summary>
/// 处理授权失败的 HTTP 请求。
/// </summary>
/// <param name="filterContext">封装用于 System.Web.Mvc.AuthorizeAttribute 的信息。 filterContext 对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。</param>
protected override void HandleUnauthorizedRequest(HttpActionContext httpContext)
{
if (httpContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any() ||
httpContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
{
return;
}
base.HandleUnauthorizedRequest(httpContext);
var response = httpContext.Response = httpContext.Response ?? new HttpResponseMessage();
response.StatusCode = HttpStatusCode.Forbidden;
var ajax = new AjaxJson
{
code = (int)CodeStatus.NoAuthorization,
msg = AjaxJson.GetEnumDescription(CodeStatus.NoAuthorization),
};
response.Content = new StringContent(ajax.SerializeToJson(), Encoding.UTF8, "application/json");
} /// <summary>
/// 验证用户票证
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
private bool ValidateTicket(HttpActionContext httpContext)
{
var res = false;
//获取HttpContext
dynamic ctx = httpContext.Request.Properties["MS_HttpContext"];
if (ctx != null)
{
var ticObject = WHCache.Default.Get<CookiesCache>(FormsAuthentication.FormsCookieName);
if (ticObject != null)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticObject.ToString());
if (!ticket.Expired && ticket.CookiePath == ctx.Request.UserHostAddress)
{
//这里只是做了简单的获取到了票证,并且票证未有效和IP地址是否一致,进一步优化可以做到验证用户信息等。
//如果没有登录,肯定是没有获取到票证的。
res = true;
}
}
}
return res;
}
}
}
using System;
using System.Web.Http;
using Game.Web.Models; namespace Game.Web.ApiControllers
{
[Authorize.APIAuthorize]
[RoutePrefix("api/home")]
public class HomeController : BaseController
{
/// <summary>
/// 用户登录
/// </summary>
/// <returns></returns>
[Route("list"), HttpPost, AllowAnonymous]
public AjaxJsonResult List(UserInfo info)
{
AjaxJsonResult ajax = new AjaxJsonResult() { };
try
{
//假装成功并返回了我们想要的数据,哈哈。
}
catch (Exception ex)
{
LogHelper.Error("获取报错!", ex);
}
return ajax;
}
}
}
再分享一下Json的返回格式吧。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using System.Web; namespace Game.Web.Models
{
/// <summary>
/// Api返回类
/// </summary>
public class AjaxJsonResult
{
#region 属性
/// <summary>
/// 状态码
/// </summary>
public int code { get; set; } /// <summary>
/// 消息
/// </summary>
public string msg { get; set; } /// <summary>
/// 返回数据
/// </summary>
public object data { get; set; } /// <summary>
/// 总行数
/// </summary>
public object count { get; set; }
#endregion #region 构造函数
/// <summary>
/// 构造函数
/// </summary>
public AjaxJsonResult()
{
code = (int)CodeStatus.OK;
msg = string.Empty;
data = "";
count = string.Empty;
}
#endregion
} /// <summary>
/// 接口状态码
/// </summary>
public enum CodeStatus
{
#region 操作返回码
/// <summary>
/// 成功
/// </summary>
[Description("成功")]
OK = , /// <summary>
/// 失败
/// </summary>
[Description("失败")]
Error = -, #region 登录返回码
/// <summary>
/// 请先登陆
/// </summary>
[Description("请重新登陆")]
NoLogin = -, /// <summary>
/// 密码不能为空
/// </summary>
[Description("密码不能为空")]
NotPassEmtry = -, /// <summary>
/// 验证码错误
/// </summary>
[Description("验证码错误")]
VerifyCodeError = -, [Description("未授权,请重新登录")]
NoAuthorization = -,
#endregion /// <summary>
/// 其他
/// </summary>
[Description("其他")]
EveryThing = -,
}
}
以上就是我的Web API简单登录权限验证。
然后Web MVC 的登录权限验证,其实和这个也差不多,请看我的另一篇。
https://www.cnblogs.com/nnnnnn/p/10923262.html
.net web api 权限验证的更多相关文章
- asp.net web api 权限验证的方法
思路:客户端使用header或者form讲验证信息传入api,在权限验证过滤中进行处理,代码示例: 定义过滤器 public class ApiFilter1 : System.Web.Http.Au ...
- 基于JWT的web api身份验证及跨域调用实践
随着多终端的出现,越来越多的站点通过web api restful的形式对外提供服务,很多网站也采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于cookie的Session Id的 ...
- ASP.NET Web API 安全验证之摘要(Digest)认证
在基本认证的方式中,主要的安全问题来自于用户信息的明文传输,而在摘要认证中,主要通过一些手段避免了此问题,大大增加了安全性. 1.客户端匿名的方式请求 (无认证) HTTP/ Unauthorized ...
- Web API 身份验证 不记名令牌验证 Bearer Token Authentication
1. Startup.Auth.cs文件 添加属性 public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; p ...
- ASP.NET Web API模型验证以及异常处理方式
ASP.NET Web API的模型验证与ASP.NET MVC一样,都使用System.ComponentModel.DataAnnotations. 具体来说,比如有:[Required(Erro ...
- ASP.NET Web API身份验证和授权
英语原文地址:http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-a ...
- web api简单验证实现办法
需要使用WEBAPI,但是有验证问题没解决.后来参考网上文章做了一下DEMO 思路: 就是根据用户的账号在服务端加密一个字符串,然后返回给用户端. 具体: 一个用户编号用于唯一身份识别,密码,一个密钥 ...
- ASP.NET MVC 5 WEB API 用户验证
参考博客:ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1) 参考博客:MVC WebApi 用户验证 (2)构建ASP.NET MVC5+E ...
- asp.net Web API 身份验证 不记名令牌验证 Bearer Token Authentication 简单实现
1. Startup.Auth.cs文件 添加属性 1 public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; ...
随机推荐
- linux pkgsrc 学习(一) 安装pkgsrc
使用pkgsrc.joyent.com 提供的linux 包 下载包 # # Copy and paste the lines below to install the 64-bit EL 7.x s ...
- requests--发送请求
前戏 使用python做接口自动化,必须用到requests这个库,功能非常的强大,能满足我们大部分的需求. 官网:https://2.python-requests.org//zh_CN/lates ...
- Ubuntu放弃战斗, Linux桌面的悲哀 - 简书
Ubuntu放弃战斗, Linux桌面的悲哀 - 简书 https://www.jianshu.com/p/86dd6e34ce91
- cocos: RenderTexture 合并精灵图片
var render = new cc.RenderTexture(730, 450); //创建渲染纹理对象,并数字确定宽度 render.begin(); var sp1 = cc.Sprite. ...
- oracle-DBlink基本操作
01,查询 查询DBLINK信息 select * from dba_db_links; select owner,object_name from dba_objects where object_ ...
- 【07月15日】A股滚动市盈率PE最低排名
仅根据最新的市盈率计算公式进行排名,无法对未来的业绩做出预测. 方大集团(SZ000055) - 滚动市盈率PE:2.53 - 滚动市净率PB:1.13 - 滚动年化股息收益率:4.01% - 建筑 ...
- linux中断子系统
参考引用:http://www.wowotech.net/sort/irq_subsystem wowotech:一个很好的linux技术博客. 一.概述 目的 kernel管理硬件设备的方式:轮询. ...
- 027 奥展项目涉及的javascipt知识点笔记
1.获取指定div标签内的所有input标签 let inputs = document.getElementById("inspect-part1").getElementsBy ...
- vCenter6.7的简单安装与使用
1.VMware的vCenter已经有了很大的改进,安装过程极为简单方便. 2. 下载vCenter的安装包即可. 我这边下载的ISO为: VMware-VIM-all--.iso 网上有资源,通过百 ...
- Excel技能提升
函数 字符串全半角之间的转换 ASC将全角英文字母转换为半角英文字母,其语法是ASC(text) WIDECHAR()将半角英文字母转换为全角英文字母,语法是=WIDECHAR(text) find( ...