为什么不飞机上能用wifi玩手机吗,难道就我一个

The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.給Asp.net MVC Forms 驗證設置角色訪問控制
&&& 当我们使用Asp.net MVC Forms方式验证用户, 然后设置Controller 或 Action 的&Authorize属性时, 默认情况下只有Users属性可以设置(这里的Users通常是指用户登录名), 我们无法直接设置用户的角色信息 , 当建立一个依赖角色的应用时(又不想麻烦配置Membership),我们有必要给认证用户加上角色信息,下面是具体方法 :
1.Web.config 配置 ,以下设置标明我们使用Forms验证
&authentication mode="Forms"&
&forms loginUrl="~/Account/LogIn" timeout="30"&slidingExpiration="true"
cookieless="UseCookies" path="/" name=".MYASPXAUTH" /&
&/authentication&
&!--&authorization&
&deny users="?"/&
&/authorization&--&
&&& 具体配置参考:/zh-cn/library/1d3t3c61(v=vs.100).aspx
name="name"
loginUrl="URL"
defaultUrl="URL"
protection="[AllNoneEncryptionValidation]"
timeout="[MM]"
path="path"
requireSSL="[truefalse]"
slidingExpiration="[truefalse]"&
enableCrossAppRedirects="[truefalse]"
cookieless="[UseUriUseCookiesAutoDetectUseDeviceProfile]"
domain="domain name"
ticketCompatibilityMode="[Framework20Framework40]"&
&credentials&...&/credentials&
&&& slidingExpiration:是否滑动过期,应设置为true&&&&&&& name属性:如果服务器有多个应用程序,每个应用程序的name属性应不同。&&& 上面代码注释掉了deny 设置,如果设置了上面的项,则所有页面都需要用户登录。注释掉之后,只在访问在Controller或Action上面设置了验证用户或角色的页面时,才提示登录。2&Global.asax.cs 添加验证请求事件代码 ,如果用户信息已经设置, 则重新构造带角色信息的用户对象 , 角色信息从身份凭证票据的UserData属性中获取,多个角色以逗号隔开。
protected void Application_AuthenticateRequest(object sender, EventArgs e)
var app = sender as HttpA
if (app.Context.User != null)
var user = app.Context.U
var identity = user.Identity as FormsI
// We could explicitly construct an Principal object with roles info using System.Security.Principal.GenericPrincipal
var principalWithRoles = new GenericPrincipal(identity, identity.Ticket.UserData.Split(','));
// Replace the user object
app.Context.User = principalWithR
&&& 上面代码是Asp.net请求管道中的一个环节,每次请求时都会执行。&&& 如果UserData中还想保存其它数据,需要使用其它分隔符进行分割并处理。&&& 这种方式主要用于系统功能简单,角色较少的应用。经过上面角色的转换,系统就可以直接使用内部定义的验证方式进行验证了。
3.用户合法性验证通过后, 构造带角色信息的加密身份凭据 , 角色信息存储在票据的UserData中。
[HttpPost]
public ActionResult LogOn(User user)
// check user by quering database or other ways. skip this logic.
string userRoles = "admin,user,powerUser";
bool isPersistent = false;
int version = 0;
double persistentMinutes = 30.00; // minutes
string userName = user.N
string cookiePath = FormsAuthentication.FormsCookieP
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, userName, DateTime.Now, DateTime.Now.AddMinutes(persistentMinutes), isPersistent, userRoles, cookiePath);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(cookie);
return Redirect(Request.QueryString["returnUrl"]);
isPersistent:是否将cookie持久化保存到客户端硬盘。一般应该选择false,即每次访问都要登录。但可以将用户名保存到客户端,用户登录时直接取得并设为默认。
HttpCookie userNmaecook=new HttpCookie("MyAppUserName",userName);
vljidcook.Expires=DateTime.Now.AddDays(200);
this.Context.Response.Cookies.Add(userNmaecook);
4. 使用角色信息控制用户对Controller 或 Action 的访问 , 因为我们上面设置用户拥有admin , user , powerUser 角色, 所以用户有权访问此方法
public class HomeController : Controller
[Authorize(Roles="admin,powerUser")]
public ActionResult Index()
//用户拥有 admin,user,powerUser 角色, 所以可以访问此方法。
return View();
&&& 一般权限应按ontroller设置,后台管理和前台浏览使用不同的controller。
5. 以下是AuthorizeAttribute&AuthorizeCore方法的源码 , 我们可以看到其中只要用户有AuthorizeAttribute.Roles设置中的任意角色, 就可以通过AuthorizeAttribute 的审核
// This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method.
protected virtual bool AuthorizeCore(HttpContextBase httpContext)
if (httpContext == null)
throw new ArgumentNullException("httpContext");
IPrincipal user = httpContext.U
if (!user.Identity.IsAuthenticated)
return false;
if (_usersSplit.Length & 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
return false;
if (_rolesSplit.Length & 0 && !_rolesSplit.Any(user.IsInRole))
return false;
return true;
更多相关文章
ASP.NET MVC 3 使用Forms身份验证 身份验证流程 一.用户登录 1.验证表单:ModelState.IsValid 2.验证用户名和密码:通过查询数据库验证 3.如果用户名和密码正确,则在客户端保存Cookie以保存用户登录状态:SetAuthCookie 1):从数据库中查出用户名 ...
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidato
在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie.cs文件,并添加高亮行如下所示: using S po
来源:/jhxk/articles/26128
在ASP.NET MVC项目中,给某个Model打上了MaxLength特性如下:public class SomeClass { [MaxLength(16, ErrorMessage = &最大长度16&)] p
源地址:/super-ln/p/unobtrusive.html 最近在学习asp.netMVC,发现其中的验证方式书写方便快捷,应用简单,易学好懂. 验证方式基于jQuery的validate 验证方式,也可以说是对jQuery validate的验证方 ...
原文:/hyl8218/archive//2259116.html 从HttpUnauthorizedResult的源码可以看出,HttpUnautho
项目需要,使用到了CKEditor编辑器.这是个很不错的富文本编辑器,但是当它綁定的字段需要进行模型验证的时候,却会出现验证失效的问题.因此本文旨在记录这个问题和给出解决辦法.以下以ValidationAttribu
系列文章 Visual Studio 2015速递(1)--C#6.0新特性怎么用 Vis ...
大家都知道instanceof一般就是用来检查A对象是否为B类或
/mgen/p/3426303.html 注意
Drawable drawable = mContext.getResources().getDrawable(R.drawable.duringtime); drawable.setBounds(0, 0, dra
首先,nginx必定会设置一个Header传送过来真实的IP nginx.conf server { proxy_set_header X-Real-IP $remote_ location / { pro
1.基本术语
1.1.实体和属性
实体(entity):指现实世界中客观存在,并可相互区别的事物或者事件.
属性(attribute):一组用来描述实体特征的属性.
在制作网站的时候,你必须要确保有一个系统化.结构合理的布局使得能够更快更轻松的组织网站的内
在combox中,ComboBox的 id和 hiddenId 必须是不同的, 因为不应该有两个DOM节点共用一个相同的id. 所以,如果ComboBox的 name 和 hiddenName是相同的,你必须指定一个 ...
// // NavController.m // // Created by Joe Zhang on 15/5/23. // Copyright (c) 2015年 张秀清. All rights reserved ...
vim 配置 jeffy-vim-v2.8.tgz  在做网站的时候,都会用到用户登录的功能。对于一些敏感的资源,我们只希望被授权的用户才能够访问,这让然需要用户的身份验证。对于初学者,通常将用户登录信息存放在Session中,笔者在刚接触到asp.net的时候就是这么做的。当我将用户信息存在在Session中时,常常会遇到Session丢失导致用户无法正常访问被授权的资源,保持用户登录状态时的安全性问题,无休止的将用户导航到登录页面等莫名其妙的问题。
  其实,在asp.net中,我们有更好的解决方案,那就是通过Forms身份验证,从而对用户进行授权,这种方法可以轻松的保持用户的登录状态(如果用户想这样),便捷的用户授权配置,增强的安全性等好处。废话不再多说,下面我们来做一个简单的用户身份验证。
  在做例子之前,我们先定义如下用户类,类名为SampleUser,代码如下:
public partial class SampleUser
public string UserName
get { return }
set { username = }
public string UserPWD
get { return }
set { userpwd = }
public override bool Equals(object obj)
SampleUser other = obj as SampleU
if (other == null || other.UserName != this.UserName)
return false;
return true;
public partial class SampleUser
public static List&SampleUser& userList = new List&SampleUser& {
new SampleUser() { UserName = "01", UserPWD = "123"},
new SampleUser() { UserName = "02", UserPWD = "123"
new SampleUser() { UserName = "03", UserPWD = "123" },
new SampleUser() { UserName = "04", UserPWD = "123" },
public static SampleUser GetUser(string userName)
return userList.Find(u=&u.UserName == userName);
  在类SampleUser中,定义了UserName和UserPWD两个字段,分别用来存储用户的登录名和密码信息。在SampleUser类的另一部分中,我们提供了一个用户的静态类表,用来代替存储在数据库中的用户信息,提供一个方法GetUser,用来获取用户信息。
  在这个例子中,我们演示用户必须进行登录才能访问网站的资源,如果没有登录,则将用户导航到login.aspx页面中。
  第一步,在web.config中添加配置信息,说明网站要使用Forms身份验证,并指定登录页面和默认登录成功后的跳转页面,然后指定拒绝未登录用户的访问,代码如下:
&authentication mode="Forms"&
&forms loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" /&
&/authentication&
&authorization&
&deny users="?"/&
&/authorization&
  完成这一步后,我们再打开Default.aspx页面,在没有登录的情况下,页面会被导航到Login.aspx页面,我们的第一步的目的已经达到了。
  第二步,完成Login.aspx的页面逻辑。在页面中添加两个TextBox控件,用来输入用户名和密码;添加一个CheckBox控件,用来选择是否保持登录状态;添加一个Button控件,响应用户的登录操作。相应的代码如下:
&fieldset&
&legend&用户登陆&/legend&
用户名:&asp:TextBox ID="txtUserID" runat="server" Width="150" /&&br /&&br /&
密&&&码:&asp:TextBox ID="txtUserPWD" runat="server" TextMode="Password" Width="150" /&&br /&&br /&
&asp:CheckBox ID="cbSaveUserName" runat="server" Checked="true" Text="保持登录状态" /&
&/div&&br /&
&asp:Literal ID="ltMessage" Text="" runat="server" Visible="false" /&
&asp:Button ID="btnLogin" Text="登陆" runat="server" OnClick="btnLogin_Click" /&
&/fieldset&
  接下来完成后台代码,添加登陆按钮的后台处理方法:对用户名和密码进行验证,如果验证通过,则
protected void btnLogin_Click(object sender, EventArgs e)
string userID = this.txtUserID.Text.Trim();
string userPWD = this.txtUserPWD.Text.Trim();
SampleUser userEx = SampleUser.GetUser(userID);
if (userEx == null)
ltMessage.Text = "用户不存在!";
ltMessage.Visible = true;
if (userEx.UserPWD != userPWD)
ltMessage.Text = "用户名或密码错误,请重新输入!";
ltMessage.Visible = true;
//添加票据,并将用户导航到默认页面
FormsAuthentication.RedirectFromLoginPage(userEx.UserName, this.cbSaveUserName.Checked);
  完成这一步后,我们就已经完成了简单Froms验证的功能。运行程序,你会发现,这里存在一个问题!!!
  你发现了吗?当我们被导航到login.aspx时,这个页面的样式丢失了!这是因为我们对整个网站的资源进行了访问限制,如果没有登陆,用户不仅无法访问.aspx页面,甚至连css文件、js文件都无法访问。显然,这不是我们想要的,因为这些资源并不是敏感的资源。在通常情况下,我们只希望对部分文件夹中的文件进行验证访问限制,而不是整个网站,例如,我们允许只对User文件夹下的页面进行访问限制,因为这个文件夹中存放的是用户的私人信息,这些信息是敏感的。这该如何实现呢?
  为了完成演示分目录验证,我们在项目中添加一个User文件夹,并添加UserInfo.aspx、 UserLogin.aspx两个页面。UserInfo.aspx用来展示用户信息,它的业务逻辑我们不是我们关心的,UserLogin.aspx页面用来让用户登陆,代码跟Login.aspx页面几乎完全相同。
  第一步:修改Web.config文件,允许匿名用户访问系统资源。
&authorization&
&allow users="?"/&
&/authorization&
  第二步:在User文件夹下添加一个Web.config文件,修改代码,拒绝匿名用户访问该文件夹下的资源。
&authorization&
&deny users="?"/&
&/authorization&
  完成这两步后,我们访问UserInfo.aspx时,如果没有登陆,则会被导航到~/User/UserLogin.aspx页面,当登陆后,又会被导航到~/User/UserInfo.aspx页面。这个时侯,我们的登陆页面样式并没有丢失,这说明我们的配置文件起作用了。
  接下来,我们想在UserInfo.aspx页面中显示出已登陆用户的用户名和密码(这里完全是为了演示如何获取登陆用户数据才这样做的,通常用户的密码是不会展示的)。在进行登陆后,用户的票据信息被加密保存在Cookie中,这个票据中,有已登录用户的名称信息,我们通过获取票据中的用户名,即可获取到完整的用户信息。
  为了显示用户信息,我们在页面中放置两个Label控件,代码如下:
&h2&&p&用户名:&asp:Label ID="lblUserName" Text="" runat="server" /&&/p&&p&密&&&&码:&asp:Label ID="lblUserPWD" Text="" runat="server" /&&/p&&/h2&
  然后,我们在页面的Load方法中,获取并展示用户信息:
if (this.Context.User != null && this.Context.User.Identity != null && this.Context.User.Identity.IsAuthenticated){
SampleUser user = SampleUser.GetUser(this.Context.User.Identity.Name);
if (user != null)
this.lblUserName.Text = user.UserN
this.lblUserPWD.Text = user.UserPWD;
  再次运行我们的代码,当用户登陆后(如果保持登陆状态,即使关掉并重新打开浏览器),我们都可以获取到已登录用户的Name,从而获取用户的对象。
  如果要退出登陆,我们只需要删除保存在Cookie中的票证信息即可,这个功能Forms验证已经帮我们完成,代码很简单:
FormsAuthentication.SignOut();  //退出登陆
  在本文中,没有涉及到角色的验证,这是因为通过在配置文件中指定角色这种方法并不够灵活,如果角色是可以在程序中维护的,那么我们在这里的指定就形同虚设了。感兴趣的朋友可以自行学习,也并不复杂。在本文的结尾,附上详细的Forms验证在Web.config中的配置说明:
name="name"
loginUrl="URL"
defaultUrl="URL"
protection="[All|None|Encryption|Validation]"
timeout="[MM]"
path="path"
requireSSL="[true|false]"
slidingExpiration="[true|false]"&
enableCrossAppRedirects="[true|false]"
cookieless="[UseUri|UseCookie|AutoDetect|UseDeviceProfile]"
domain="domain name"
ticketCompatibilityMode="[Framework20|Framework40]"&
&credentials&...&/credentials&
name:指定要用于身份验证的 HTTP Cookie。如果正在一台服务器上运行多个应用程序并且每个应用程序都需要唯一的 Cookie,则必须在每个应用程序的 Web.config 文件中配置 Cookie 名称。默认值为 ".ASPXAUTH"。
loginUrl:指定如果找不到任何有效的身份验证 Cookie,将请求重定向到的用于登录的 URL。默认值为 login.aspx。
defaultUrl:定义在身份验证之后用于重定向的默认 URL。默认值为 "default.aspx"。&
protection:指定 Cookie
使用的加密类型(如果有)。默认值为 All。
timeout:指定 Cookie 过期前逝去的时间(以整数分钟为单位)。如果 SlidingExpiration 属性为 true,则 timeout 属性是滑动值,会在接收到上一个请求之后的指定时间(以分钟为单位)后过期。 为防止危及性能并避免向开启 Cookie 警告的用户发出多个浏览器警告,当指定的时间逝去大半时将更新 Cookie。这可能导致精确性受损。默认值为 "30"(30 分钟)。&
path:为应用程序发出的 Cookie 指定路径。默认值是斜杠 ( /),这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回 Cookie。
requireSSL:指定是否需要 SSL 连接来传输身份验证 Cookie。默认值为 False。&
slidingExpiration:指定是否启用可调过期时间。可调过期将 Cookie 的当前身份验证时间重置为在单个会话期间收到每个请求时过期。默认值为 True。
enableCrossAppRedirects:表明是否将通过身份验证的用户重定向到其他 Web 应用程序中的 URL。默认值为 False。&
cookieless:定义是否使用 Cookie 以及 Cookie 的行为。默认值为 UseDeviceProfile.
domain:指定在传出 Forms 身份验证 Cookie 中设置的可选域。此设置的优先级高于 httpCookies 元素中使用的域。默认值为空字符串 ("")。
ticketCompatibilityMode:指定在 Forms 身份验证中对于票证到期日期使用协调世界时 (UTC) 还是本地时间。默认值为 Framework20。
credentials:允许选择在配置文件中定义名称和密码凭据。您还可以实现自定义的密码架构,以使用外部源(如数据库)来控制验证。
阅读(...) 评论()  一、什么是单点登录
  单点登录就是在多个Web应用程序中,实现统一登录方式,一但登录了某web应用程序,其它相关联的web应用程序都无需再次登录,一个地方退出,所有相关联的web应用程序都退出.
  二、通过利用ASP.net Forms验证模式可以实现子域名(SubDomain)共享登陆下的缺陷
  要利用ASP.NET Form验证模式实现同一主域下不同子域名共享登陆状态需要进行以下配置
  配置Web.config
  1.把 Asp.net的认证模式改为Forms认证模式,domain 要等于你的应用程序对应的域名,例如: .
    &authentication mode="Forms"&       &forms name=".ASPNETFORM"  domain="." loginUrl="/login.aspx"  defaultUrl="/default.aspx"protection="All" timeout="30" path="/"  requireSSL="false" slidingExpiration="true"enableCrosSAPpRedirects="false"  cookieless="UseDeviceProfile" /&    &/authentication&
  2.配置针对存储在cookie中的票据信息进行加密解密的方式
&machineKeyvalidationKey="CF10047DB84FBA7F418BF30FEDDA3AB336B5B31BA6858DFFBE4E5ECDEA5708BABBD"  decryptionKey="5D37DDB652B86956" validation="SHA1"/&
  备注:生成machineKey网址
   /tools/keycreator.aspx
  登陆创建验证票据
  1.应用程序登陆页面(Login.aspx)输入用户名、密码并验证通过后,创建一张加密过的验证票据,并存储在cookie中
            //创建验证票             FormsAuthenticationTicket ticket                = new  FormsAuthenticationTicket(1, name, DateTime.Now,                     DateTime.Now.AddDays(1d), false,                     HttpContext.Current.Request.UserHostAddress                    );            string authTicket = FormsAuthentication.Encrypt(ticket);            HttpCookie cookie = new  HttpCookie(FormsAuthentication.FormsCookieName, authTicket);            cookie.Domain = ConfigurationManager.AppSettings["SSODomain"];            HttpContext.Current.Response.Cookies.Add(cookie);
  2.登陆完毕后进入有权限的页面,并可得到验证通过后的ID User.Identity.N
            if (!User.Identity.IsAuthenticated)            {                //未登录                 Response.Redirect("/login.aspx");            }            string  name = User.Identity.N
  3.登出页面,清空用户信息,并销毁票据
            HttpContext.Current.Session.Clear();            FormsAuthentication.SignOut();
  三、Forms验证 实现子域名(SubDomain)共享登陆下的缺陷
  根据以上讲解,均可实现同一主域名下的多个子域名共享登陆状态,但是主域名有所限制,当主域名为1个字母,而后缀为2个字母的域名,不能通过认证,例如:a.cn域名,a.jp域名 均不能实现子域名共享登陆,而其他域名均能实现,例如:,
等,大家亦可通过修改hosts文件试验一下,如有高手知道怎么解决这个问题的,请指教,谢谢!!并附上 Demo程序 ,请大家指教!
  PS:因本人公司的域名为p.cn,想通过Form认证的模式实现子域名共享登陆状态,但是死活用不上!~~!!汗,不知道这个算不算微软的Bug。
【】【】【】【】
ISBN编号:&8
出版时间:&2013-3
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&ISBN编号:&9
出版时间:&2013-4
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&
????????????
????????????
         Copyright ©
() All Rights Reserved

我要回帖

更多关于 飞机上能用wifi玩手机吗 的文章

 

随机推荐