.NET Authorize(微软基础权限框架)如何适用于Cordova

最近折腾Cordova,希望能跟开发B/S项目一样开发一套APP程序,这样开发成本和维护成本以及学习成本可以降到最低;

之所以选择Cordova主要还是个人经历有限,不想去折腾Android和Ios开发了.自己陷入.NET比较深;

并且cordova又可以速成APP;如果不是做性能要求高的APP(比如游戏)其实是很推荐使用cordova.之前看到有调查显示混合APP占到了7成左右确实惊人!

基本上服务器端使用.NET MVC 5;技术主要是Rest API 交互;
客户端APP主要使用Cordova 使用Typescript生成javascript;用到了不少cordova的插件比如二维码扫描,定位之内的;

一开始架构以及开发环境进展都很顺利,但是最近发现一个问题.cordova需要调用服务器端需要授权的api接口的时候没办法做权限了.
因为cordova中没有cookie存储,并且就算有cookie也不能跨域,网上搜索了下 居然收不到.NET相关的解决方案;哎.只能说cordova生态不咋地;
而且.NET社区的cordova更不咋地了; 只能靠自己思考这个问题;

我的实现其实也简单,既然客户端不支持cookie那么HTML5的 localstore 或者sessionstore还是支持的吧.
另外jquery异步调用的时候 我们传递header头 服务器端通过header头判断用户信息不久可以了;思维还是很简单的;

首先从服务器端开刀:

实现自己的AuthorizeAttribute,代码如下:

namespace .....WebUI.Framework.Security {

    /// <summary>
    /// 用于移动端Cordova授权校验:
    /// </summary>
    public class CordovaAuthorizeAttribute : AuthorizeAttribute {

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var request = filterContext.RequestContext.HttpContext.Request;

            if (request.IsAuthenticated)
            {
                base.OnAuthorization(filterContext);
                return;
            }

            //使用header校验Cordova的安全
            //xhr.setRequestHeader("username", "");
            //xhr.setRequestHeader("password", "");

            var username = request.Headers["username"];
            var password = request.Headers["password"];

            if (string.IsNullOrEmpty(username) ||
                string.IsNullOrEmpty(password))
            {
                //用户信息无效
                filterContext.Result = new HttpUnauthorizedJsonResult();

                return;
            }

            try
            {
                //这里根据自己的业务代码获取用户在数据库中存储的内容.
                //为了性能这里可以加缓存.
                var svc = EngineContext.Current.Resolve<IMemberService>();
                var user = svc.GetUserInfo(username, FindByType.ByUserName);

                if (user == null)
                {
                    //无法查找到用户
                    filterContext.Result = new HttpUnauthorizedJsonResult();
                    return;
                }

                if (user.Status.GetValueOrDefault(0) != 1)
                {
                    //用户已经被锁定
                    filterContext.Result = new HttpUnauthorizedJsonResult();
                    return;
                }

                var hasher = new PasswordHasher();
                var flag = hasher.VerifyHashedPassword(user.PasswordHash, password);
                if (flag == PasswordVerificationResult.Failed)
                {
                    //校验失败
                    filterContext.Result = new HttpUnauthorizedJsonResult();
                    return;
                }

                if (string.IsNullOrEmpty(Roles) && string.IsNullOrEmpty(Users))
                {
                    //成功:
                    return;
                }

                if (string.IsNullOrEmpty(Roles) && Users.Split(new[] { ",", ";" },
                    StringSplitOptions.RemoveEmptyEntries).Contains(username, StringComparer.OrdinalIgnoreCase))
                {
                    //成功:
                    return;
                }

                if (!string.IsNullOrEmpty(Roles))
                {
                    var userRoles = user.AspNetRoles.Select(a => a.Name).ToList();

                    foreach (var _role in Roles.Split(new[] { ",", ";" },
                      StringSplitOptions.RemoveEmptyEntries))
                    {
                        foreach (var role in userRoles)
                        {
                            if (role.Equals(_role, StringComparison.OrdinalIgnoreCase))
                            {
                                //成功:
                                return;
                            }
                        }
                    }
                }

            }
            catch
            {
                //用户名称错误等异常
                //todo:
            }

            //校验失败:
            filterContext.Result = new HttpUnauthorizedJsonResult();
        }
    }

    /// <summary>
    /// Json错误
    /// </summary>
    internal class HttpUnauthorizedJsonResult : JsonResult {

        public override void ExecuteResult(ControllerContext context)
        {
            //避免Cordova调用后重定向
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;

            Data = new
            {
                status = (int)HttpStatusCode.Unauthorized
            };

            JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            base.ExecuteResult(context);
        }
    }
}

  

服务器端代码搞定了.我们可以在我们的Action以及 Controller上面加上专供 cordova授权校验的 CordovaAuthorizeAttribute 属性头了.

比如:

[CordovaAuthorize(Roles="Admin")]
public ContentResult Test(string id)
{

return Content("Success");
}

cordova客户端调用服务器端API的代码就更简单了直接贴出来:

       var url = "服务器端的地址";

        $.ajax(url, {
            crossDomain: true,
            data: {
                rnd: Math.random()
            },
            beforeSend: function (xhr) {
                //这里用户名和用户密码建议存储到sessionstore中.
                xhr.setRequestHeader("username", "用户名");
                xhr.setRequestHeader("password", "用户密码");
            },
            success: function (data, status, req) {
                if (data.status && data.status==401) {
                    //授权失败.那么根据自己的业务跳转到登陆页面吧:
                }
                //其他的status就根据自己的业务返回就可以了:
            },
            error: function (error) {
                alert(JSON.stringify(error));
            },
            method: "GET", //根据自己的业务确定是POST还是GET
            complete: function () {
                alert("complete!");
            },
            timeout: 5000
        });

然后棘手的问题就迎刃而解了;
如果考虑到客户端安全的话可以考虑密码加密.如果考虑到后端校验对数据库查询过于频繁可以考虑适当的使用缓存;

本人最近自学Cordova希望园子里面有志同道合之士共同探索研究!
最后任何问题都可以交流沟通 谢谢!

时间: 2024-11-04 21:00:47

.NET Authorize(微软基础权限框架)如何适用于Cordova的相关文章

权限框架 基础知识

权限管理框架 属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源   包括用户身份认证和授权两部分,简称认证授权 1.身份认证 判断一个用户是否为合法用户的处理过程: 最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确 2.授权管理 即访问控制,控制谁能访问哪些资源: 体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访

权限框架之Shiro详解

文章大纲 一.权限框架介绍二.Shiro基础介绍三.Spring Boot整合Shiro代码实战四.项目源码与资料下载五.参考文章 一.权限框架介绍 1. 什么是权限管理   权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.  权限管理包括用户身份认证和授权两部分,简称认证授权.对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问.1.1 用户身份认证  身份认证,就是判断一个用

Shiro 权限框架使用总结

我们首先了解下什么是shiro ,Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势 Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证.授权.管理会话以及密码加密.如下是它所具有的特点: 易于理解的 Java Security API: 简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等): 对角

Web3D编程入门总结——面向对象的基础Web3D框架

本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框架的编写方法.在上一篇的基础上,要求读者具有简短英文阅读或者查字典的能力. 限于水平和时间,本文难免出现错误与遗漏,您在阅读过程中如果遇到错误或者疑问请在评论区中指出,我将尽快回复. 为提高JavaScript编程效率,建议使用WebStorm工具进行网页程序编写,WebStorm官网:http:/

java权限框架 SpringMVC_mybatis or hibernate+ ehcache二级缓存

A 代码生成器(开发利器);  B 阿里数据库连接池druid; C 安全权限框架shiro ; D ehcache 自定义二级缓存  (后续会加入Activiti5 工作流 ) 系统为主流的 springmvc+mybaits 3.2 版本 ,提供maven的pom.xml文件,另免费赠送hibernate版本一套(垮数据库) 1. 有 oracle .msyql.spring3.0.spring4.0  一共 4 套版本全部提供没有打jar没有加密的源代码(最下面截图2.1版本) 2. 支持

SpringMVC_mybatis or hibernate+ ehcache二级缓存java权限框架

A 代码生成器(开发利器);  B 阿里数据库连接池druid; C 安全权限框架shiro ; D ehcache 自定义二级缓存  (后续会加入Activiti5 工作流 ) 系统为主流的 springmvc+mybaits 3.2 版本 ,提供maven的pom.xml文件,另免费赠送hibernate版本一套(垮数据库) 1. 有 oracle .msyql.spring3.0.spring4.0  一共 4 套版本全部提供没有打jar没有加密的源代码(最下面截图2.1版本) 2. 支持

权限工作流平台系列-基础权限版

一.基础权限版介绍:联系作者   1039318332        1.基础权限版地址:http://www.eipflow.com:9998/Account/Login   或者通过http://www.eipflow.com也可进入 2.开发工具:Vs2017+SqlServer 2008R2 及以上版本 3.系统采用前后端分离模式开发,后端使用最新的Core2框架,使用MongoDb作为缓存工具,前端使用Adminlte框架进行二次开发,可自由换肤,自己进行扩展       4.系统设计

shiro权限框架与spring框架轻松整合

2017年06月26日 17:53:30 阅读数:419 shiro是一个权限框架,用于管理网站的权限,大到网站登录过滤,小到一个菜单或按钮是否显示,shiro学习起来非常简单,以下是shiro的执行流程图: 看完不懂的请下载shiro全套视频教程: http://pan.baidu.com/s/1jHOX2MM Subject为当前用户,当它访问系统的时候,就会经过SecurityManager安全管理器,安全管理器类似一个中转站,它实际上会让Realm类来处理用户的认证和授权信息,认证和授权

关于Apache Shiro权限框架的一些使用误区的解释

多了不说了,进入正题,shiro是个权限框架提供权限管理等功能,网上的教程一般都是互相抄,比如<shiro:principal property="xxx"/>这个标签,网上教程告诉你可以用来获取登录用户的任何属性,但现实中如果你这么写,并且按照开涛教程上写的登陆逻辑,肯定百分百报错,这是为什么呢?因为网上教程的登录部分一般这么写: 这是重写authorizingrealm的dogetAuthenticationinfo方法: protected Authenticatio