.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 怎样更改locale语言设置
推荐使用UTF8编码,因为这是国际标准,能兼容任何语言的编码.在CentOS VPS下修改语言编码: localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 export ...
- WordPress隐藏后台左侧菜单如何操作
前面我们讲了wordpress后台添加左侧边栏菜单如何操作,反过来如果想要隐藏一些菜单怎么实现呢?我们可以通过remove_menu_page()函数来完成,将如下代码加入到当前主题function. ...
- Chrome 禁止 http 自动转化为https
Chrome 浏览器 地址栏中输入 chrome://net-internals/#hsts 在 Delete domain security policies 中输入项目的域名,并 Delete 删 ...
- 初赛Part2
初赛 时间复杂度 主定理(必考) \[ T(n) = aT(\frac{n}{b})+f(n) \] 其中,\(n\)为问题的规模,\(a\)为递推下子问题的数量,\(\frac{n}{b}\)为每个 ...
- [LeetCode] 300. Longest Increasing Subsequence 最长递增子序列
Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...
- cf 1182 E - Product Oriented Recurrence
当时脑残了, 不会写矩阵快速幂中更改的系数, 其实把他扔到矩阵里同时递推就好了 #include<cstdio> #include<algorithm> #include< ...
- MySQL实战45讲学习笔记:第二十二讲
一.引子 不知道你在实际运维过程中有没有碰到这样的情景:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内.临时性地提升一些性能. 我以前做业务护航的时候,就偶尔会碰上这种场景.用 ...
- [LeetCode] 508. Most Frequent Subtree Sum 出现频率最高的子树和
Given the root of a tree, you are asked to find the most frequent subtree sum. The subtree sum of a ...
- Linux-iostat命令
查看TPS和吞吐量信息[oracle@oracle01 ~]$ iostatLinux 3.10.0-693.el7.x86_64 (oracle01) 07/31/2019 _x86 ...
- xunit测试无法找到testhost或没有可用测试的问题解决方法
xunit进行测试,需要安装如下几个包: Microsoft.TestPlatform.TestHost Microsoft.NET.Test.Sdk xunit.runner.visualstudi ...