最近由于项目需要在写webservice用于手机app调用,在登录这块遇到安全的问题,要求是在webservice里写一个token用于存储用户的登录信息,貌似还要存储文件什么的,但是在webservice里怎么写,能不能给个code的例子
一.用户凭据拦截器
1.从app请求的头部获取token
2.判断token是否有效
3.如果无效返回401 有效顺利进入controller和action
二.登录操作
1.获取前端传入的账号和密码(最好是加密的)
2.服务端校验用户和密码(解密的)是否有效
3.如果无效提示他, 有效则创建token
4.将创建的token 放在response里返回
5.app存token 每次请求携带此token
--拦截器代码
public class AuthFilter: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (!SkipAuthorization(context) && !this.IsAuthorized(context))
{
this.HandleUnauthorizedRequest(context);
}
else
{
base.OnActionExecuting(context);
}
}
/// <summary>
/// 是否有授权
/// </summary>
/// <param name="actionContext"></param>
/// <returns></returns>
protected virtual bool IsAuthorized(ActionExecutingContext actionContext)
{
var auth = ServiceUtil.GetServiceProvider<IAuthentication>();
var user = auth.GetCurrentUser(actionContext.HttpContext);
return user != null;
}
/// <summary>
/// 处理未授权的请求
/// </summary>
/// <param name="actionContext"></param>
protected virtual void HandleUnauthorizedRequest(ActionExecutingContext actionContext)
{
var actionr = new PrincpilUser();
actionContext.HttpContext.Response.StatusCode = 401;
actionContext.Result = actionr;
}
private static bool SkipAuthorization(ActionExecutingContext actionContext)
{
var controllerActionDescriptor = actionContext.ActionDescriptor as ControllerActionDescriptor;
var isAllowAnonymous = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
.Any(a => a.GetType().Equals(typeof(AllowAnonymousAttribute)));
return isAllowAnonymous;
}
}
class PrincpilUser : ActionResult
{
public string msg = "您没有访问权限!";
}
--此处通过AOP注入了不同的认证方式所以判断token是在IAuthentication 中做的
--登录的action中
//生成token
string token = CreateToken(model);
//将token放入Header中
HttpContext.Response.Headers.Add("Token", token);
--CreateToken 方法里会将token 放到redis,便于拦截器快速读取并验证
纯手敲,望采纳, 可随时沟通