C# WebApi 实现身份验证(权限验证)之 Basic基础认证
WebApi实现身份验证有四种方式:
- FORM身份验证
- 集成WINDOWS验证
- Basic基础认证
- Digest摘要认证
本文使用的是Basic基础认证实现。
先简单说一下思路:
要让别人调用你的WebApi时,需要在Authorization 中设置basic用户名和密码,才可以访问(最后的Postman测试)
当调用controller时,需要先验证请求中的身份信息,通过才实现调用Controller的方法,如何实现呢?就是给controller添加一个自定义的验证特性。
所以首先,创建一个验证特性:
/// <summary>
/// 基础身份验证特性
/// </summary>
public class BasicAuthenticationAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
//检验用户ticket信息,用户ticket信息来自调用发起方
if (actionContext.Request.Headers.Authorization != null)
{
//解密用户ticket,并校验用户名密码是否匹配
var encryptTicket = actionContext.Request.Headers.Authorization.Parameter;//请求信息中验证信息的参数
if (ValidateUserTicket(encryptTicket))//自定义的判断身份方法
base.OnActionExecuting(actionContext);//通过身份验证则继续执行Controller方法
else
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);//请求状态设置为 401 认证不通过
actionContext.Response.Content = new StringContent("权限不足", Encoding.UTF8, "application/json");//返回错误信息
//LogHelper
}
}
else//请求中没有添加验证信息,则返回错误
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
string err = "拒绝访问,请先添加验证信息后,在访问此接口!";
actionContext.Response.Content = new StringContent(err, Encoding.UTF8, "application/json");
}
}
/// <summary>
/// 校验用户ticket信息
/// </summary>
/// <param name="encryptTicket"></param>
/// <returns></returns>
private bool ValidateUserTicket(string encryptTicket)
{
string userpwd = Encoding.Default.GetString(Convert.FromBase64String(encryptTicket));//参数中的验证信息,转为string
return userpwd.Equals("admin:123");
}
}
然后在自己的Controller上添加这个验证特性。调用的时候就会先调用特性中的身份验证方法。我这里增加了一个父类controller,只要需要身份验证的Controller都可以继承它。
Postman测试: