最近由于项目需要在写webservice用于手机app调用,在登录这块遇到安全的问题,要求是在webservice里写一个token用于存储用户的登录信息,貌似还要存储文件什么的,但是在webservice里怎么写,能不能给个code的例子
1条回答 默认 最新
- 香烟_有毒 2022-03-17 13:32关注
一.用户凭据拦截器
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,便于拦截器快速读取并验证
纯手敲,望采纳, 可随时沟通
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥30 vs2010开发 WFP(windows filtering platform)
- ¥15 服务端控制goose报文控制块的发布问题
- ¥15 学习指导与未来导向啊
- ¥15 求多普勒频移瞬时表达式
- ¥15 如果要做一个老年人平板有哪些需求
- ¥15 k8s生产配置推荐配置及部署方案
- ¥15 matlab提取运动物体的坐标
- ¥15 人大金仓下载,有人知道怎么解决吗
- ¥15 一个小问题,本人刚入门,哪位可以help
- ¥30 python安卓开发