做一个登录权限验证。

开始吧。

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 权限验证的更多相关文章

  1. asp.net web api 权限验证的方法

    思路:客户端使用header或者form讲验证信息传入api,在权限验证过滤中进行处理,代码示例: 定义过滤器 public class ApiFilter1 : System.Web.Http.Au ...

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

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

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

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

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

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

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

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

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

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

  7. web api简单验证实现办法

    需要使用WEBAPI,但是有验证问题没解决.后来参考网上文章做了一下DEMO 思路: 就是根据用户的账号在服务端加密一个字符串,然后返回给用户端. 具体: 一个用户编号用于唯一身份识别,密码,一个密钥 ...

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

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

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

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

随机推荐

  1. sql注入知识点

    需找sql注入点1\无特定目标inurl:.php?id= 2\有特定目标:inurl:.php?id= site:target.com 3\工具爬取spider,对搜索引擎和目标网站的链接进行爬取 ...

  2. .net使用IIdentity和IPrincipal实现自定义身份及权限认证【转】

    1,通过继承BasePage页实现角色权限控制 context.User中保存的信息就是相关的角色与权限信息.Context.User类型为System.Security.Principal.IPri ...

  3. requests--Cookie设置

    前戏 有些页面需要登录才可以访问,而服务器是根据cookie来进行判断的,服务器拿到浏览器的cookie,然后再数据库里进行查询判断,如果校验通过,则服务器认为是登录过的,才有继续访问的权限,否则,服 ...

  4. Scala词法文法解析器 (二)分析C++类的声明

    最近一直在学习Scala语言,偶然发现其Parser模块功能强大,乃为BNF而设计.啥是BNF,读大学的时候在课本上见过,那时候只觉得这个东西太深奥.没想到所有的计算机语言都是基于BNF而定义的一套规 ...

  5. 别傻傻不知道 == 和 equals 的区别【面试系列】

    ​ 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本类型比较,equals 是对象比较,不懂 hashCode,想起来简 ...

  6. pgsql_pg的数据类型

    PostgreSQL 提供了丰富的数据类型.用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型.PostgreSQL 的数据类型被分为四种,分别是基本数据类型.复合数据类型.域和伪类 ...

  7. ffmpeg Operation not permitted 报错的解决过程记录

    问题重现 由于视频的录制过程出现了一些小问题,需要重新将视频文件切割和合并,找了几个视频编辑软件来做这个事情,最终的结果都不是特别满意,当时已经挺晚的了,本来打算上床睡觉第二天再去想辙,从椅子上起身的 ...

  8. mongodb集群化

    转自:https://www.cnblogs.com/nulige/p/7613721.html 一.mongodb主从复制配置 主从复制是MongoDB最常用的复制方式,也是一个简单的数据库同步备份 ...

  9. HttpRuntime.Cache 与 HttpContext.Current.Cache

    1.HttpRuntime.Cache是应用程序级别的, 2.而HttpContext.Current.Cache是针对当前WEB上下文定义的. 3.这二个都是调用的同一个对象,不同的是:HttpRu ...

  10. 管道的原子性 linux写操作原子性

    从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题 限制管道的大小.实际上,管道是一个固定大小的缓冲区.在Linux中该换冲区的大小为一页,4k 使得他的 ...