原文地址: https://blog.csdn.net/chadcao/article/details/7859394

ASP.NET的安全认证,共有“Windows”、“Form”、“Passport”、“None”四种验证模式。下面来说说From认证,内容分三部分:

第一部分—— 怎样实现From 认证;

第二部分—— Form 认证的实战运用;

第三部分—— 实现单点登录(Single Sign On)

第一部分如何运用 Form表单认证

一、新建一个测试项目

为了更好说明,有必要新建一个测试项目(暂且为“FormTest”),包含三张页(Default.aspx、Login.aspx、UserInfo.aspx)。

二、修改 Web.config

1、 双击项目中的Web.config

2、 找到下列文字<authenticationmode="Windows"/> 把它改成:

<authenticationmode="Forms">

<formsloginUrl="Login.aspx"name=".ASPXAUTH"></forms>

</authentication>

3、 找到<authorization><allowusers="*"/></authorization>换成

<authorization><denyusers="?"></deny></authorization>

<authenticationmode="Forms">
<forms loginUrl="Login.aspx" name=".APSX"></forms>
<denyusers="?"></deny>
</authentication>

三、编写 .cs代码——登录与退出

1、 登录代码:

code1:

private void Btn_Login_Click(object sender, System.EventArgs e)
{
if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456")
{
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false);
}
}

code2:

privatevoid Btn_Login_Click(object sender, System.EventArgs e)
{
if(this.Txt_UserName.Text=="Admin" && this.Txt_Password.Text=="123456")
{
System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false);
Response.Redirect("Default.aspx");
}
}

以上两种都可发放验证后的Cookie ,即通过验证。

区别:

code1:指验证后返回请求页面,俗称“从哪来就打哪去”。比如:用户没登录前直接在 IE地址栏输入http://localhost/FormTest/UserInfo.aspx ,那么该用户将看到的是 Login.aspx?ReturnUrl=UserInfo.aspx,输入用户名与密码登录成功后,系统将根据“ReturnUrl”的值,返回相应的页面。

code2:则是分两步走:通过验证后就直接发放 Cookie ,跳转页面将由程序员自行指定,此方法多用于Default.aspx 使用框架结构的系统。

2、 退出代码:

privatevoid Btn_LogOut_Click(object sender, System.EventArgs e)
{
System.Web.Security.FormsAuthentication.SignOut();
}

四、如何判断验证与否及获取验证后的用户信息

有的时候,在同一张页面需要判断用户是否已经登录,然后再呈现不同的布局。有人喜欢用Session 来判断,我不反对此类做法,在此我只是想告诉大家还有一种方法,且看下面代码:

if(User.Identity.IsAuthenticated)
{
//你已通过验证,do something...
}

User.Identity还有两个属性AuthenticationType(验证类型)与Name(用户名称),大家要注意的是 Name 属性,此处的User.Identity.Name将得到,验证通过(RedirectFromLoginPage或SetAuthCookie)时,我们带入的第一个参数this.Txt_UserName.Text。这个参数很重要,关系到种种情况

第二部分 Form认证的实战运用

一、Web.config 的作用范围

新建项目时, VS.Net会在项目根目录建立一个内容固定的 Web.config。除了在项目根目录,你还可以在任一目录下建立 Web.config,条件就是应用程序级别的节点只能在根目录的 Web.config中出现。

关于 Web.config设置的作用范围,记住以下两点:

1、 Web.config的设置将作用于所在目录的所有文件及其子目录子文件(继承:子随父姓)

2、 子目录下的 Web.config设置将覆盖由父目录继承下来的设置(覆盖:县官不如现管)

二、学会拒绝与巧用允许

注册页 面(Register.aspx)与审核页面(Auditing.aspx),当访问Register.aspx时,却回到了Login.aspx?ReturnUrl=Register.aspx。这是一个问题。

1、 新建一个目录 Public,用于存放一些公用的文件,如万年历、脚本呀……

2、 在“解决方案资源管理器”中右击点击目录 Public,新增一个 Web.config

3、 把上述 Web.config的内容统统删除,仅留以下即可:

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<system.web>
<authorization><allow users="*"/></authorization>
</system.web>
</configuration>

根据“覆盖”原则,我们知道上述 Web.config将替代根目录 Web.config中的<authorization>节点设置,即:

<allowusers="*"/>替换 <deny users="?"></deny>

注解:“allow”允许的意思;“*”表示所有用户;

“deny”拒绝的意思;“?”表示匿名用户;

因此,处于 Public目录下的文件,允许所有人浏览,包括未验证的用户。把 Register.aspx 放到这里,在没有登录的时候也可以访问了。

审核页面(Auditing.aspx),审核权限一般都在管理员或主管手里,并不想让其他人浏览此页面。

新建一个管理员的目录 ManageSys ,在此目录下再新增一个 Web.config。内容如下:

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow users="Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</configuration>

现在的问题就是怎么才能知道谁是“Admin”呢,在第一部分说到:

System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); //通过验证,发放Cookie

this.Txt_UserName.Text是allow与deny的依据,上文的意思为当this.Txt_UserName.Text==“Admin”账号时可以访问ManageSys目录下的文件。

例子:此项目有两部门使用,其中每个部门分别都有些特定的页面仅供本部门用户浏览使用,请问该如何使用 Web.config达到效果?

只需要在验证用户名与密码后,取得该用户的部门名称或部门代码,把它作为判断的依据就行了。

Web.config中的 <location>节点的path属性可以是一张具体页面的相对 URL路径,如下:<location path ="ManageSys/Auditing.aspx">

三、分散与集中

到目前为此,我们的测试项目“FormTest”已经拥有两个目录三个 Web.config,伴随用户需求的多样化,Web.config也会越来越多,比如常用的文件上传功能等等。众多的 Web.config分布在不同的目录里面,维护起来肯定比较烦人。能不能集中起来管理呢,怎样做?

要想集中管理,不得不用到<location>节点与 path 属性。在本项目中,我们将目录 Public与 ManageSys下的设置放在根目录下的 Web.config里面,如下:

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<location path ="Public">
<system.web>
<authorization><allowusers="*"/></authorization>
</system.web>
</location>
<location path ="ManageSys">
<system.web>
<authorization><allowusers="Admin"/><denyusers="*"/></authorization>
</system.web>
</location>
<system.web>
<!-- 这里放置原来根目录 Web.config 的内容,就不列出来了 -->
</system.web>
</configuration>

注意点:

1、 <location>节点的位置是在 <configuration>的一个子节点,它与原有的 <system.web>属于并列关系

2、 <location>节点只需要放入对应子目录 Web.config中的 <system.web>的节点内容

四、额外的保护

认证的目的就是为了防止他人非法浏览页面,或未经许可使用某些功能。当然,世上没有绝对的安全,如今 MD5加密都被我们国人给破解了,就是最好的例证。

细心的人可能早就发现 ASP.NET的安全认证只针对 .aspx、.ascx…… 等 ASP.NET 文件起作用,而对普通页面与文件却“视而不见”,如 .htm、.js、.jpg等。通过以下步骤你就可以保护你想保护的文件类型。

1、 打开 Internet信息服务(IIS)管理器→ 右击本项目虚拟目录 → 属性,如下图

2、 点击按钮“配置”,出现如下对话框:

3、 双击 .aspx的应用程序扩展 → 查看对话框内容,如下图:

4、 复制“可执行文件”的全路径名称后→ 点击“取消”返回上一层对话框 → 点击按钮“添加”

5、 粘贴刚才复制的内容(我的系统装在 D盘,所以内容为D:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll) → 填写后缀名为 .htm→ 填写动作限制为“GET,HEAD,POST,DEBUG”

6、 最后点击“确定”→ 往项目中添加 HtmlPage1.htm →在 IE 浏览器的地址栏直接输入http://localhost/FormTest/HtmlPage1.htm→ 观看测试效果

第三部分实现单点登录(Single Sign On)

一、Machine.config

Machine.config ,在C:\WINDOWS【或WINNT 】\Microsoft.NET\Framework\v1.1.4322【或v1.0.3705 】\CONFIG,控制着 .NET Framework的本机配置。

Machine.config 与 Web.config是父子关系,同样适用于继承与覆盖。

1、 Machine.config中的设置将作用于运行在本机的所有站点及其虚拟目录,遇到子目录将一直继承下去。

2、 Web.config中的设置将覆盖由 Machine.config中继承下来的对应的节点设置

Machine.config中的 <system.web>节点所有内容都能出现在项目根目录下的 Web.config中,也就是说能在 Web.config中的内容已经在 Machine.config中一一列出。

其中<system.web>节点下的 <pages> 还能出现在页面上,如: HTML视图下,在WebForm1.aspx的第一行加上<pages>的节点内容validateRequest="false"。如:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="FromTest.WebForm1" validateRequest="false" %>

二、单点登录(Single Sign On)的前提条件

何为单点登录(Single Sign On)?从字面理解就是在一个地方登录,通常运用于 ASP.NET分布式环境中(跨单个服务器上的多个应用程序或在网络场中)的 Forms身份验证。比如登录QQ空间之后,就不需要在QQ音乐里登录了,台湾香港又把Single Sign On称为“单一登入”。

要想实现此功能,首要条件是需要一组用于加密与验证加密的密钥。它们位于 Machine.config中,修改 <system.web>节点下的 <machineKey>节点属性,如下:

<machineKeyfirstKey="172"copyrightKey="Cityhunter172" validationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**CITYHUNTER172@126*COM*****F2F286CDCB15A9D1D4535E16DB0248026939"secondKey="meibu"decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939"validation="SHA1" thirdKey="com" />

1、 validationKey为用于验证加密数据的密钥。最小长度为 40个字符(20字节),最大长度为 128个字符(64字节)。

2、 decryptionKey为用于加密数据的密钥。长度只有 16个字符(8字节)与 48个字符(24字节)两种。

3、 validation为用数据验证使用的加密类型。拥有“SHA1”“MD5”“3DES”三种方法

4、 大伙参照上述<machineKey>试着在WebForm1.aspx运行下列语句:

this.TextBox2.Text ="ht"+"tp"+"://"+firstKey+"."+secondKey+"."+thirdKey

大家在修改之前请先备份一下 Machine.config,到时要是出错可别怪我没提醒你。以上密钥并不是胡乱得来的,接下来向大家介绍生成密钥的方法。

我们把上面中提到的WebForm1.aspx 拖入本项目的 Public 目录下,再往页面上拖入一个TextMode=MultiLine的TextBox3与一个 Button编写按钮事件与函数:

private void Button1_Click(object sender, System.EventArgs e)
{
string decStr = this.CreateKeyString(int.Parse(this.TextBox1.Text));
string valStr = this.CreateKeyString(int.Parse(this.TextBox2.Text));
this.TextBox3.Text=string.Format("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>",valStr,decStr);
} /// <summary>
/// 生成加密型强随机 Key 值
/// </summary>
/// <param name="i">Key的有效长度:
/// decryptionKey 的有效值为 8 或 24;
/// validationKay 的有效值为 20 至 64
/// </param>
private string CreateKeyString(int i)
{
System.Security.Cryptography.RNGCryptoServiceProvider rng =newSystem.Security.Cryptography.RNGCryptoServiceProvider(); //加密随机数生成器
byte[] bt = new byte[i];
rng.GetBytes(bt);//用加密型强随机值序列填充字节数组
System.Text.StringBuilder str =new System.Text.StringBuilder();
for(int j= 0;j<i;j++)
{
str.Append(string.Format("{0:X2}",bt[j]));//转换成大写的十六进制文本
}
return str.ToString();
}

每次点击按钮生成密钥都不同,大家不妨多点几次。切换至 HTML视图,到WebForm1.aspx第一行把validateRequest="false"去掉,然后再多点几次 Button1试试,看看会有什么效果。

三、单点登录(Single Sign On)的站点示例

将上述 TextBox3产生的文本,覆盖Machine.config中的,现在你的机器已经具备了单点登录的条件。大伙可以再新建一个项目FormTest2 ,从 FormTest2 登录后直接输入 FormTest中的Default.aspx的网址(http://localhost/FormTest/ Default.aspx),反之亦可。

下面结合实例讲解:环胜数码网站、权限管理系统、IT内部管理网,我把这三个不相干的项目做成了单点登录的模式,加上整合站点的主页面,共有四个地方可以进行登录。因为用户 Table的结构不同,因此只有一个入口能在进入后,在跳转站点时不会出错,那就是在整合页面登录。以下meibu.com为举例的域名。

现在我想把环胜数码这个站点单独脱离出来,而剩下的两个站点继续实现单点登录,该怎么做呢?或者是我的ASP.NET的空间是租的,服务商肯定不可能让我修改 Machine.config ,根据上述 Machine.config与 Web.config的关系,我们可以把 <machineKey>节点放入项目根目录下Web.config的<system.web>节点。如下:

1、 权限管理系统项目的 Web.config用于 Form认证的设置

<machineKeyvalidationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**CITYHUNTER172@126*COM*****F2F286CDCB15A9D1D4535E16DB0248026939"decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939"validation="SHA1" />

<authenticationmode="Forms">

<formsloginUrl="Login.aspx"name="172.MEIBU.COM_WARRANT"></forms>

</authentication>

<authorization><denyusers="?"></deny></authorization>

2、 IT内部管理网项目的 Web.config用于 Form认证的设置

<machineKeyvalidationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**CITYHUNTER172@126*COM*****F2F286CDCB15A9D1D4535E16DB0248026939"decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939"validation="SHA1" />

<authenticationmode="Forms">

<formsloginUrl="Login.aspx"name="172.MEIBU.COM_IT"></forms>

</authentication>

<authorization><denyusers="?"></deny></authorization>

a、两个项目Web.cinfig的<machineKey>节点确保以下几个字段完全一样:validationKey、decryptionKey、validation

b、两个项目的 Cookie名称必须相同,也就是 <forms>中的 name 属性,这里我们把它统一为name="172.MEIBU.COM_PROJECT"

c、注意区分大小写

在整合的过程中,我把遇到的问题向大伙说一下,以免你们走同样的路。

1、首先应该是用户管理的问题,把两个项目的用户整合在一起,可不是一件容易的事,原则是新建一个新的 Table只存放帐号与密码,用账号做关联,编写触发器,做到 Table之间的同步;

2、不要指望两个项目间用 Session进行传值,两个应用程序的 Session是无法共享的。网上有人曾把类库(编译后的 .dll文档)放入同一个 bin文件夹实现过 Session共享,这样的做法实际上是把两个项目变相合并成一个应用程序,不是我们所想要的,理由很简单:QQ空间与 QQ音乐的服务器分处两地该怎么办?

3、项目间的传值,可用 Cookie实现。System.Web.Security.FormsAuthentication.SetAuthCookie 方法即可实现登录,单点登录的实质就是含有身份验证票的 Cookie能在项目间共用。

四、Cookie 在 ASP.NET中的用法

大家也许和我一样,很少在 ASP.NET中使用 Cookie,传参数呀,存变量呀,用的比较多的是 Session或ViewState以及隐藏控件,有的干脆用URL传参。

1、Cookie存放的目录

Cookie是存放在客户端的东东,放在“Temporary Internet Files”目录,所以说存在安全性的问题。通过以下方式找到具体位置:打开控制面板→ Internet选项 → 常规 → Internet 临时文件→ 设置 → 即可看到“当前位置”,→ 点击“查看文件”将直接打开该文件夹,你也可以点击“移动文件夹”变更它所在的位置。参照下图

2、Cookie 的有效期

从上图我们可以清楚的看到每个 Cookie文档的“截止期”(即为有效期)。在有效期内,当登录计算机的用户 Administrator再次访问 172.meibu.com 时,那么 IE就会在请求页面的同时,连同上述的名称为“Cookie:administrator@172.meibu.com”的Cookie文档内容一起发送给服务器。

若该文档包含多个 Cookie的值时,截止期则以最后的失效期为准。

3、Cookie的类型

这里我们按有效期来分,分为两种:

a、即时型

指的是关闭浏览器(所有浏览 172.meibu.com的 IE)后,Cookie便失效,此类 Cookie不会在“Temporary Internet Files”目录出现。其实它也有截止期的,为“0001-01-01”

b、持久型

就是已指定具体“截止期”的,能够在“Temporary Internet Files”目录里面找到的Cookie

4、 Cookie的内容

双击打开“Cookie:administrator@172.meibu.com”,我们看到以下内容,如下图

上图中,“■”是换行符,所以服务器读出来的格式如下图

5、在 ASP.NET页面发放 Cookie

发送上述 Cookie的 .cs代码为:

System.Web.HttpCookie ck =new HttpCookie("ckValue0");
ck["Author"] ="CityHunter";
ck.Expires = System.DateTime.Now.AddMinutes(10);//若不指定,则为即时型 Cookie
//ck.Path="/FormTest/ManageSys"; //设置 Cookie 的虚拟路径,注意一定要以“/”开头,否则为无效 Cookie ;请大家自行看一下它与在客房端的 Cookie 文档“名称”与 “Internet 地址”的关系
Response.Cookies.Add(ck);
ck = new HttpCookie("ckValue1"); //重新新建一个名为 ckValue1 的 Cookie
ck.Expires = System.DateTime.Now.AddMinutes(20); //即刻起 20 分钟后失效
ck["E_Mail"] ="cityhunter172@126.com"; //设置 ckValue1 中的 E_Mail 值
ck["PersonalWeb"] ="172.meibu.com";
Response.Cookies.Add(ck); //添加此 Cookie

6、取回已发放 Cookie的值

Response.Write(Request.Cookies["ckValue0"]["Author"]+"<br>");//用不着说明了吧
Response.Write(Request.Cookies["ckValue1"]["E_Mail"]+"<br>");
Response.Write(Request.Cookies["ckValue1"]["PersonalWeb"]);

例子:给 Cookie赋于以下值,怎样得到它的正确值

ck["str1"] ="2222";

ck["str"] ="str0=11111&str1=223";

可以肯定的是Request.Cookies["ckValue1"]["str"]得不到 “str0=11111&str1=223”这个字串,大家不妨试一下Request.Cookies["ckValue1"]["str1"] 会得到意想不到的字串哟。

提示:使用Server.UrlEncode()与Server.UrlDecode()

五、发放永久性的验证 Cookie

大家登录 CSDN的时候是否留意到一个“2周内不用再登录”的复选框,它又是怎么做到的呢?大家是否曾遇到过这样的困惑:在执行System.Web.Security.FormsAuthentication.SetAuthCookie时明明已指定createPersistentCookie为 true 为何关闭浏览器仍不能直接访问网站?

System.Web.Security.FormsAuthenticationTicket tk =new System.Web.Security.FormsAuthenticationTicket(

1,  //指定版本号:可随意指定

"Admin",//登录用户名:对应 Web.config 中 <allow users="Admin" … /> 的 users 属性

System.DateTime.Now,  //发布时间

System.DateTime.Now.AddYears(100),  //失效时间:100 年以后,够久了吧

false,  //是否为持久 Cookie:尚未发现有何用,至少目前偶还不知,下面会有说明

"测试用户数据"//用户数据:可用 ((System.Web.Security.FormsIdentity)User.Identity).Ticket.UserData 获取

);

string str = System.Web.Security.FormsAuthentication.Encrypt(tk);//加密身份验票

//声明一个 Cookie,名称为 Web.config 中 <forms name=".APSX" … /> 的 name 属性,对应的值为身份验票加密后的字串

System.Web.HttpCookie ck =new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,str);

//指定 Cookie 为 Web.config 中 <forms path="/" … /> path 属性,不指定则默认为“/”

ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath;

//此句非常重要,少了的话,就算此 Cookie 在身份验票中指定为持久性 Cookie ,也只是即时型的 Cookie 关闭浏览器后就失效;因此上面我说:我是真的还不知在身份验票中指定为持久性 Cookie 有何用。

ck.Expires = System.DateTime.Now.AddYears(100);

Response.Cookies.Add(ck);//添加至客户端

C#之Form表单认证的更多相关文章

  1. php laravel加密 form表单认证 laravel分页

    use Illuminate\Support\Facades\Crypt; echo Crypt::encrypt(123); //加密echo "<br>";//解密 ...

  2. Django 中的Form表单认证

    一.Form表单   1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签   1.2 创建表单类Form 1. 创建 ...

  3. Django之form表单认证

    Model常用操作: - 参数:filter 三种传参方式 - all(得到的是列表),values(字典),values_list(元祖) [obj(id,name,pwd,email),obj(i ...

  4. Django--分页器(paginator)、Django的用户认证、Django的FORM表单

    分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...

  5. Form authentication(表单认证)问题

    前言 最近在做ASP.NET MVC中表单认证时出了一些问题,特此记录. 问题 进行表单认证时,在 PostAuthenticateRequest 事件中从Cookie值中解密票据.如下: prote ...

  6. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  7. input file 在开发中遇到的问题 类似ajax form表单提交 input file中的文件

    最近在做项目的过程中遇到个问题,在这里做个记录防止日后忘记 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为 ...

  8. ajax form表单提交 input file中的文件

    ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...

  9. Django学习笔记(6)——Form表单

    知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...

随机推荐

  1. 图文结合深入理解JS中的this值

    文章目录 Js 中奇妙的this值 1. 初探this 2. this指向总结 2.1 普通函数调用 2.2 对象的方法调用 2.3 构造函数调用 2.4 利用call,apply,bind方法调用函 ...

  2. laravel起步的一些小问题

    工作中主要使用的是.NET,PHP只是我业余喜欢的一门语言,而之前一直用的是yii2框架,觉得Yii2是最好的框架了,然而,laravel在业界的名声太大,被誉为:最优雅的框架,所以,我决定花点时间研 ...

  3. AWVS 10.5使用指南

    前言 AWVS是一款可与IBM AppScan比肩的.功能十分强大的Web漏洞扫描器.由Acunetix开发,官方站点提供了关于各种类型漏洞的解释和如何防范,具体参考:Acunetix Web Vul ...

  4. Homebrew的安装

    Homebrew是一款Mac OS平台下的软件包管理工具. 安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserc ...

  5. cesium计算当前地图范围extent以及近似当前层级zoom

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  6. linux搭建TFTP服务

    1.安装tftp服务和客户端 sudo apt-get install xinetd tftp tftpd 2.配置 vim /etc/xinetd.d/tftp 内容如下: service tftp ...

  7. rest.css解决不同浏览器元素默认样式不同的问题

    html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...

  8. 理解OAuth2

    目录 理解OAuth2 Oatuh2用来做什么 Oauth2具体做法 Oauth2的流程 授权码模式 第三方引导用户跳转至认证服务器的授权页面 用户选择是否给予授权 认证服务器生成code并且让用户重 ...

  9. C语言函数调用过程,汇编角度查看

    C语言函数调用过程,汇编角度查看 把函数的参数按照调用约定压栈或者存储到寄存器中 调用要使用的函数,先把调用者的地址入栈,方便回来 跳转到函数 把函数使用到的一些寄存器压栈,避免修改寄存器的值 执行函 ...

  10. idea之常用快捷键

    之前一直在使用eclipse,后来工作中慢慢开始使用idea了,这里总结一些idea的快捷键,方便以后查询使用. 一.查找相关快捷键 1.双击shift在项目的所有目录查找,就是你想看到你不想看到的和 ...