最近由于项目需要在写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,便于拦截器快速读取并验证
纯手敲,望采纳, 可随时沟通
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 metadata提取的PDF元数据,如何转换为一个Excel
- ¥15 关于arduino编程toCharArray()函数的使用
- ¥100 vc++混合CEF采用CLR方式编译报错
- ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
- ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
- ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
- ¥50 如何openEuler 22.03上安装配置drbd
- ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
- ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
- ¥15 Windows11, backspace, enter, space键失灵