ASP.NET -- WebForm -- Cookie的使用

ASP.NET -- WebForm --  Cookie的使用

Cookie是存在浏览器内存或磁盘上。

1. Test3.aspx文件

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test3.aspx.cs" Inherits="Test3" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title></title>
</head>
<body><form id="form1" runat="server"><div><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div></form>
</body>
</html>

2. Test3.aspx.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;public partial class Test3 : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){if (Request.Cookies["myProject"] != null){//如果浏览器端发送给服务器端的Cookie有'myProject',则显示'myProject'的Cookie值Label1.Text = Request.Cookies["myProject"].Value;}else{//如果浏览器端发送给服务器端的Cookie没有'myProject',则设置'myProject'的Cookie值Response.Cookies["myProject"].Value = "Test3";//没有设置过期时间的cookie是存在浏览器内存中的,浏览器关闭就会消失//设置了过期时间的cookie,关闭浏览器也不消失,是存在浏览器所使用的磁盘文件上的//设置cookie的有效期为一天, 该cookie一天后就会失效//Response.Cookies["myProject"].Expires = DateTime.Now.AddDays(1);}}}
}

3. 实现结果

(1) 首次访问页面,没有cookie值,则设置cookie的值,服务器通过响应报文把要设置的cookie发送给浏览器。

(2) 再次访问页面时。浏览器会将cookie放在发送报文中,发送给服务器端。服务器端可将接收到的cookie值显示出来。

应用程序权限设计

我们在开发系统的时候,经常会遇到系统需要权限控制,而权限的控制程度不同有不同的设计方案。

  1. 1.       基于角色的权限设计

这种方案是最常见也是比较简单的方案,不过通常有这种设计已经够了,所以微软就设计出这种方案的通用做法,这种方案对于每一个操作不做控制,只是在程序中根据角色对是否具有操作的权限进行控制;这里我们就不做详述

  1. 2.       基于操作的权限设计

这种模式下每一个操作都在数据库中有记录,用户是否拥有该操作的权限也在数据库中有记录,结构如下:

但是如果直接使用上面的设计,会导致数据库中的UserAction这张表数据量非常大,所以我们需要进一步设计提高效率,请看方案3

  1. 3.       基于角色和操作的权限设计

如上图所示,我们在添加了Role,和RoleACTION表,这样子就可以减少USERACTION中的记录,并且使设计更灵活一点。

但是这种方案在用户需求的考验之下也可能显得不够灵活够用,例如当用户要求临时给某位普通员工某操作权限时,我们就需要新增加一种新的用户角色,但是这种用户角色是不必要的,因为它只是一种临时的角色,如果添加一种角色还需要在收回此普通员工权限时删除此角色,我们需要设计一种更合适的结构来满足用户对权限设置的要求。

  1. 4.       2,3组合的权限设计,其结构如下:

我们可以看到在上图中添加了UserAction表,使用此表来添加特殊用户的权限,改表中有一个字段HasPermission可以决定用户是否有某种操作的权限,改表中记录的权限的优先级要高于UserRole中记录的用户权限。这样在应用程序中我们就需要通过UserRole和UserAction两张表中的记录判断权限。

到这儿呢并不算完,有可能用户还会给出这样的需求:对于某一种action所操作的对象某一些记录会有权限,而对于其他的记录没有权限,比如说一个内容管理系统,对于某一些频道某个用户有修改的权限,而对于另外一些频道没有修改的权限,这时候我们需要设计更复杂的权限机制。

  1. 5.       对于同一种实体(资源)用户可以对一部分记录有权限,而对于另外一些记录没有权限的权限设计:

对于这样的需求我们就需要对每一种不同的资源创建一张权限表,在上图中对Content和Channel两种资源分别创建了UserActionContent和UserActionChannel表用来定义用户对某条记录是否有权限;这种设计是可以满足用户需求的但是不是很经济,UserActionChannel和UserActionContent中的记录会很多,而在实际的应用中并非需要记录所有的记录的权限信息,有时候可能只是一种规则,比如说对于根Channel什么级别的人有权限;这时候呢我们就可以定义些规则来判断用户权限,下面就是这种设计。

  1. 6.       涉及资源,权限和规则的权限设计

在这种设计下角色的概念已经没有了,只需要Rule在程序中的类中定义用户是否有操作某种对象的权限。

以上只是分析思路,如果有不对的地方,请大家指正。

微博:http://weibo.com/yukaizhao 推荐 牧童*红杏*墙

权限设计文章汇总

如何设计网站权限系统?

https://www.zhihu.com/question/20313385/answer/118095995

我的转载:https://www.cnblogs.com/hao-1234-1234/p/9850967.html

应用程序权限设计

http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html#!comments

我的转载 https://www.cnblogs.com/hao-1234-1234/p/8976332.html

我的sql语句实现:https://www.cnblogs.com/hao-1234-1234/p/8976643.html

现在有了Powdesigner可以自动生成sql了,那时候不知道这个工具。

扩展RBAC用户角色权限设计方案

https://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html

我的转载:https://www.cnblogs.com/hao-1234-1234/p/9850910.html

java用户角色权限设计

http://www.cnblogs.com/a7345678/archive/2008/09/25/1298838.html

我的转载:https://www.cnblogs.com/hao-1234-1234/p/8976582.html

用户、角色和权限开发

https://blog.csdn.net/u010004317/article/details/53996757

我的转载:https://www.cnblogs.com/hao-1234-1234/p/8976603.html

asp.net后台管理系统-登陆模块-是否自动登陆

FormsAuthentication.SetAuthCookie(UserFlag, createPersistentCookie);

createPersistentCookie是否永久保存cookie

https://www.cnblogs.com/joeylee/p/3521131.html

C# 读写文件摘要

主要参考地址:https://www.cnblogs.com/chenyangsocool/p/7511161.html

首先下载微软提供的工具:DsoFile  (微软官网下载传送门)

读写自定义摘要信息(需要注意,自定义摘要信息只能添加一次,再添加会报错,所以如果对应的name已经存在,只能采用修改的方式添加)

        /// <summary>/// 检测该文件属性中是否已经存在指定的自定义属性key/// </summary>/// <param name="file">本地的文件</param>/// <param name="key">自定义的key</param>/// <returns>存在key返回对应的值,不存在key返回string.empty</returns>private static string PropContains(string file, string key){OleDocumentProperties odp = new OleDocumentProperties();odp.Open(file);try{//由于不能直接foreach,所以用了for循环for (int i = 0; i < odp.CustomProperties.Count; i++){if (odp.CustomProperties[i].Name == key){return odp.CustomProperties[i].get_Value();}}}catch (Exception ex){LogUtil.Error($"{file} 文件处理出错 ex:{ ex.ToString()}");}finally{odp.Close();}return string.Empty;}/// <summary>/// 修改自定义属性的属性值(存在则修改,不存在则添加)/// </summary>/// <param name="file">本地的文件</param>/// <param name="key">自定义的key</param>/// <returns>修改成功返回true,不成功返回false</returns>private static void PropChange(string file, string key, string value){OleDocumentProperties odp = new OleDocumentProperties();odp.Open(file);try{//由于不能直接foreach,所以用了for循环for (int i = 0; i < odp.CustomProperties.Count; i++){if (odp.CustomProperties[i].Name == key){//为指定自定义属性修改值odp.CustomProperties[i].set_Value(value);odp.Save();return;}}//不存在指定属性,则添加odp.CustomProperties.Add(key, value);odp.Save();}catch (Exception ex){LogUtil.Error($"{file} 文件处理出错 ex:{ ex.ToString()}");}finally{odp.Close();}}

除开自定义摘要,还有很多自带的摘要信息可以直接使用,如下:

 [Guid("58968145-CF02-4341-995F-2EE093F6ABA3")][TypeLibType(4288)]public interface SummaryProperties{[DispId(131073)]string Title { get; set; }[DispId(131074)]string Subject { get; set; }[DispId(131075)]string Author { get; set; }[DispId(131076)]string Keywords { get; set; }[DispId(131077)]string Comments { get; set; }[DispId(131078)]string Template { get; }[DispId(131079)]string LastSavedBy { get; set; }[DispId(131080)]string RevisionNumber { get; }[DispId(131081)]int TotalEditTime { get; }[DispId(131082)]dynamic DateLastPrinted { get; }[DispId(131083)]dynamic DateCreated { get; }[DispId(131084)]dynamic DateLastSaved { get; }[DispId(131085)]int PageCount { get; }[DispId(131086)]int WordCount { get; }[DispId(131087)]int CharacterCount { get; }[DispId(131088)]dynamic Thumbnail { get; }[DispId(131089)]string ApplicationName { get; }[DispId(131090)]int DocumentSecurity { get; }[DispId(131091)]string Category { get; set; }[DispId(131092)]string PresentationFormat { get; }[DispId(131093)]int ByteCount { get; }[DispId(131094)]int LineCount { get; }[DispId(131095)]int ParagraphCount { get; }[DispId(131096)]int SlideCount { get; }[DispId(131097)]int NoteCount { get; }[DispId(131098)]int HiddenSlideCount { get; }[DispId(131099)]int MultimediaClipCount { get; }[DispId(131100)]string Manager { get; set; }[DispId(131101)]string Company { get; set; }[DispId(131102)]int CharacterCountWithSpaces { get; }[DispId(131103)]bool SharedDocument { get; }[DispId(131104)]string Version { get; }[DispId(131105)]dynamic DigitalSignature { get; }}

#2楼 2018-11-20 17:29 ~雨落忧伤~  
5. 中 
User 
Channel
Content
Action 都是基础表

UserActionContent和UserActionChannel表 是关系表

Action 好理解 相当于 某一模块
Channel 和 Content 又相当于什么呢?

支持(0)反对(0)

回复引用

#3楼[楼主] 2018-11-20 17:46 hao_1234_1234

@ ~雨落忧伤~
谁实话5、6部分我也没看懂。我把content理解为文件,UserActionContent关系表控制权限这个人可以通过ActionID对应的方法访问ContentID对应的文件,但不能访问其它文件。
支持(0)反对(0)

回复引用

#4楼[楼主] 2018-11-20 17:49 hao_1234_1234

@ ~雨落忧伤~
UserActionChannel 同理
支持(0)反对(0)

回复引用

#5楼[楼主] 2018-11-20 17:52 hao_1234_1234

@ ~雨落忧伤~
我觉得实际应用中,User表和UserActionContent表之间还可以加一个角色role表,变成 user --userRole(关系表)--role--roleActionContent。 因为一般不会单独对每一个人配置权限,因为这样UserActionConten关系表数据量会非常大。
支持(0)反对(0)

回复引用

#6楼[楼主] 2018-11-20 17:58 hao_1234_1234

@ ~雨落忧伤~
我觉得5与3的核心区别是:关系表(决定权限的表)由两种因素共同确定。而3这种经典角色表,只由一种因素决定。
支持(0)反对(0)

修改删除

#7楼 2018-11-20 18:01 ~雨落忧伤~

@ hao_1234_1234
那 5 为什么不直接用3个表
用户表 关系表 权限表
支持(0)反对(0)

修改删除

#8楼 2018-11-20 18:02 ~雨落忧伤~

@ hao_1234_1234
这样设计 是不是 资源表有多少个 不固定
Channel
Content
UserActionContent
UserActionChannel表
不固定的
支持(0)反对(0)

回复引用

#9楼[楼主] 2018-11-20 18:07 hao_1234_1234

@ ~雨落忧伤~
我同意你的看法,原作者可能是为了未来拓展的方便。 当另一个Content2要和Action组合起来控制某个权限时,可以很方面的加表解决。
支持(0)反对(0)

修改删除

#10楼 2018-11-20 18:12 ~雨落忧伤~

我觉得3,4就已经很好的满足需求了
如果在项目中再通过加表 来处理权限
未免有些麻烦 表的复杂度也会增加
支持(0)反对(0)

回复引用

#11楼[楼主] 2018-11-20 18:16 hao_1234_1234

@ ~雨落忧伤~
权限设计的复杂度取决于用户需求的复杂度,如果用户有这种需求,我们必须想办法满足需求。例如:5还可以和4结合使用,替换掉4中的UserAction,就可以应对复杂的需求变化。
支持(0)反对(0)

修改删除

#12楼 2018-11-20 18:17 ~雨落忧伤~

@ hao_1234_1234
越复杂 项目不可控程度越高
  1. 2,3组合的权限设计,其结构如下:

我们可以看到在上图中添加了UserAction表,使用此表来添加特殊用户的权限,改表中有一个字段HasPermission可以决定用户是否有某种操作的权限,改表中记录的权限的优先级要高于UserRole中记录的用户权限。这样在应用程序中我们就需要通过UserRole和UserAction两张表中的记录判断权限。

到这儿呢并不算完,有可能用户还会给出这样的需求:对于某一种action所操作的对象某一些记录会有权限,而对于其他的记录没有权限,比如说一个内容管理系统,对于某一些频道某个用户有修改的权限,而对于另外一些频道没有修改的权限,这时候我们需要设计更复杂的权限机制。

  1. 对于同一种实体(资源)用户可以对一部分记录有权限,而对于另外一些记录没有权限的权限设计:

对于这样的需求我们就需要对每一种不同的资源创建一张权限表,在上图中对Content和Channel两种资源分别创建了UserActionContent和UserActionChannel表用来定义用户对某条记录是否有权限;这种设计是可以满足用户需求的但是不是很经济,UserActionChannel和UserActionContent中的记录会很多,而在实际的应用中并非需要记录所有的记录的权限信息,有时候可能只是一种规则,比如说对于根Channel什么级别的人有权限;这时候呢我们就可以定义些规则来判断用户权限,下面就是这种设计。

5 将模块划分为大模块(一个频道模块 里面很多频道 设计了一个频道表) 子模块 没有角色概念

ASP.NET -- WebForm -- Cookie的使用 应用程序权限设计 权限设计文章汇总 asp.net后台管理系统-登陆模块-是否自动登陆 C# 读写文件摘要...相关推荐

  1. 黑马程序员课程-Vue项目实战-Element-UI——电商后台管理系统主页制作

    黑马程序员视频_主页制作 目录 一.主页布局 1.整体布局:先上下划分,再左右划分 2.主页header布局 3.左侧菜单布局:菜单分为两级,并且可以折叠 二. 通过接口获取菜单数据 1.请求预处理 ...

  2. 微信小程序开发项目源代码_SSM项目汽车租赁平台+后台管理系统

  3. 黑马程序员课程Vue实战项目_Element-ui——电商后台管理系统-商品管理(商品分类)

    目录 商品分类 一.创建一个子分支 二.创建组件 三.绘制商品分类的页面基本结构 四.功能 五.提交代码 商品分类 一.创建一个子分支 git branch--查看当前所在分支 git checkou ...

  4. 微信小程序火锅店点餐订餐预订餐桌系统+后台管理系统SSM-JAVA【数据库设计、论文、源码、开题报告】

    功能介绍 本系统的功能围绕用户.管理员两种权限设计. 管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买.预定餐桌等. 用户可以管理个人资料 ...

  5. 微信小程序记事本+后台管理系统

    <微信小程序记事本+后台管理系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的记事本前台和Java做的后台管理系统: 微信小程序--记事 ...

  6. 微信小程序菜谱+后台管理系统

    <微信小程序菜谱+后台管理系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的菜谱前台和Java做的后台管理系统: 微信小程序--菜谱前台 ...

  7. 微信小程序考勤管理系统+后台管理系统

    <微信小程序考勤管理系统+后台管理系统>该项目含有源码.文档等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的考勤前台和Java做的后台管理系统: 微信小程序-- ...

  8. 微信小程序聊天交友平台+后台管理系统

    <微信小程序聊天交友平台+后台管理系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的聊天交友前台和Java做的后台管理系统: 微信小程序 ...

  9. 利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序(上)

    本文将介绍如何利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序,分为上下两篇.上篇主要介绍实现,下篇主要介绍界面. 打开Visual ...

最新文章

  1. gitter 卸载_最佳Gitter频道:Scala
  2. 你所了解的python岗位有哪些_Python是最火语言之一,那么他适合做哪些岗位?Python最全岗位!...
  3. SecureCRT通过密钥进行SSH登录
  4. 凤凰式期权matlab代码,美式期权二叉树定价及MATLAB程序.doc
  5. g4e基础篇#2 Git分布式版本控制系统的优势
  6. HDU-4282 A very hard mathematic problem 技巧枚举+二分
  7. 我精心珍藏的Python代码技巧
  8. linux故障排查书籍,Linux系统故障排查和修复技巧.docx
  9. UserData的诡异bug
  10. Python学习笔记总结
  11. HTC 一个基站老无法定位
  12. 桌面高效便捷的多窗口调整管理工具 - AquaSnap
  13. YYKit-YYDispatchQueuePool分析
  14. 至强CPU型号系列的变化
  15. SqlServer使用top 100 PERCENT 无法排序的问题
  16. 5G语音回落4G解决方案-EPS Fallback IPLOOK
  17. double转换为二进制
  18. 期刊、会议、SCI、EI、IEEE、CCF、ACM的区别与联系
  19. Canvas+html+css+position定位
  20. 9.8日金证股份前端,得分48分

热门文章

  1. ZK tree使用mold
  2. 提高编写CSS代码效率的10个习惯
  3. [源码学习]--UGUI
  4. 在2020年学习cocos游戏引擎
  5. jsp常用的onchange事件
  6. ServiceComb抛出llegalStateException: The schema(id=[xxx]) ...异常解决办法
  7. 计算机修复画笔结果分析,Photoshop
  8. python项目开发案例集锦_在线分享 | 在 VS Code 中一站式完成 Python 项目开发
  9. linux系统终端more,一篇文章让你学透Linux系统中的more命令
  10. yum 安装oraclejdk_四、CentOS 7安装Oracle JDK