做一个登录权限验证。

开始吧。

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. docker 持久化存储

    1.data Volume  mysql5.7:dockerfile FROM debian:stretch-slim # add our user and group first to make s ...

  2. vs在matlab生成的dll中,load treebigger错误

    提示的错误:Warning: Variable 'model' originally saved as a TreeBagger cannot be instantiated as an object ...

  3. scrapy机制mark(基于twisted)

    twisted twisted管理了所有的异步任务 Twisted的主线程是单线程的,即reactor线程: 而这些io耗时操作会在线程池中运行,不再twisted主线程中运行,即通过线程池来执行异步 ...

  4. requests--会话对象,ssl验证

    会话对象 前面我们使用了添加cookie的方式来进行接口的访问,如果有几十个接口都要依赖登录,难道我们都要加上吗? Request的会话对象让你能够跨请求保持某些参数,它也会在同一请求Session实 ...

  5. VeeValidate——vue2.0表单验证插件

    一.vee-validate入门 vee-validate 是一个轻量级的 vue表单验证插件.它有很多开箱即用的验证规则,也支持自定义验证规则.它是基于模板的,因此它与HTML5验证API类似且熟悉 ...

  6. [LeetCode] 909. Snakes and Ladders 蛇梯棋

    On an N x N board, the numbers from 1 to N*Nare written boustrophedonically starting from the bottom ...

  7. [LeetCode] 2. Add Two Numbers 两个数字相加

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  8. vs2017远程调试

    使用情景:服务器端程序出了问题,但本地开发环境又无法模拟.此时需要使用VS进行远程调试. 使用方法: 找到VS安装路径,将Remote Debuuger拷贝到服务器端 (注意一定要和你本地运行的VS版 ...

  9. GreenPlum 大数据平台--segment 失效问题恢复《二》(全部segment宕机情况下)

    01,情况描述 主Segment和它的镜像都宕掉.导致了greenplum数据库不可用状态 02,重启greenplum数据库 gpstop -r 03,恢复 gprecoverseg 04,状态检查 ...

  10. java常量池-字符串常量池、class常量池和运行时常量池

    原文链接:http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的内存分配中,经常听到很多关于常量 ...