asp.net中使用窗体身份验证

代码下载:基于角色的窗体身份验证示例代码

经常看到一些网友,自己写一些代码,判断用户是否登录,判断用户权限,例如使用Session,Cookie等,实际上微软替我们做好这些事情了,我们要做的只是调用一下。节省出时间可以去www.svnhost.cn看看。

好了,废话不说,直接来代码吧!

第一步:设置web.config

<authentication mode="Forms"></authentication>,如果web.config中已经有authentication 只要添加mode="Forms"节或者可能默认是mode="Windows",修改成如上即可。

第二步:新建一个独立用户登录的类:

 

  
  
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;

namespace BLL
{
/// <summary>
/// 用户实用类
/// </summary>
public sealed class UserUtil
{
public static void Login( string username, string roles, bool isPersistent)
{
DateTime dt
= isPersistent ? DateTime.Now.AddMinutes( 99999 ) : DateTime.Now.AddMinutes( 60 );
FormsAuthenticationTicket ticket
= new FormsAuthenticationTicket(
1 , // 票据版本号
username, // 票据持有者
DateTime.Now, // 分配票据的时间
dt, // 失效时间
isPersistent, // 需要用户的 cookie
roles, // 用户数据,这里其实就是用户的角色
FormsAuthentication.FormsCookiePath); // cookie有效路径

// 使用机器码machine key加密cookie,为了安全传送
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie
= new HttpCookie(FormsAuthentication.FormsCookieName, hash); // 加密之后的cookie

// 将cookie的失效时间设置为和票据tikets的失效时间一致
if (ticket.IsPersistent)
{
cookie.Expires
= ticket.Expiration;
}

// 添加cookie到页面请求响应中
HttpContext.Current.Response.Cookies.Add(cookie);
}

public static void Logout()
{
HttpCookie cookie
= HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName];

if (cookie == null )
{
cookie
= new HttpCookie(FormsAuthentication.FormsCookieName);
HttpContext.Current.Response.Cookies.Add(cookie);
}
cookie.Expires
= DateTime.Now.AddYears( - 10 );
}
}
}

第三步:添加具体登录退出细节,新建login.aspx页面,注意,这里如果建立Login.aspx页面,有可能后台类Login和系统的Login控件冲突,这时修改下类名即可。

login.aspx.cs代码:

 

  
  
// 假设有UserInfo实体类,有UserInfo.GetUserInfoByPassword根据用户名,密码取用户的方法。chkCookie.Checked表示是否持久登录。true:下次打开浏览器自动登录。
//u.Roles表示该用户的角色,如果没有启用角色的话,随便传值即可。
UserInfo u = UserInfo.GetUserInfoByPassword(txtUserName.Text, MD5(txtPassword.Text));
if (u != null && u.UserId > 0 )
{
UserUtil.Login(u.UserName, u.Roles chkCookie.Checked);
if (Request.QueryString[ " ReturnUrl " ] != null && ! Request.QueryString[ " ReturnUrl " ].ToLower().Contains( " login.aspx " ))
Response.Redirect(Request.QueryString[
" returnUrl " ]);
else
Response.Redirect(
" / " );
}
else
Label1.Text
= " 登录失败,可能是密码错误,请重新登录 " ;

退出Logout.aspx文件,后台代码如下:

  
  
BLL.UserUtil.Logout();
if (Request.QueryString[ " returnUrl " ] != null )
Response.Redirect(Request.QueryString[
" returnUrl " ], true );
else
Response.Redirect(
" ~/ " );

至此登录和退出都有了,如果整个文件夹需要验证登录才能访问?在web.config中设置如下:

 <location path="User">
  <system.web>
   <authorization>
    <deny users="?"/>
   </authorization>
  </system.web>
 </location>

表示User目录,禁止匿名用户访问。即用户管理中心。

如果需要对登录用户也区别对待?这时用“角色”来处理就最方便了。首先需要建立如下类,该类是用来恢复用户身份和角色用的:

  
  
using System;
using System.Web;
using System.Text.RegularExpressions;
using System.Configuration;
using System.Collections;
using System.Web.Security;
using System.Security.Principal;
using System.IO;

namespace BLL
{
/// <summary>
/// MyHttpModule 的摘要说明。
/// </summary>
public class MyHttpModule : IHttpModule
{
public void Init(HttpApplication app)
{
app.AuthenticateRequest
+= new EventHandler(app_AuthenticateRequest);
app.EndRequest
+= new EventHandler(app_EndRequest);
}

void app_EndRequest( object sender, EventArgs e)
{
foreach ( string key in HttpContext.Current.Response.Cookies)
{
HttpContext.Current.Response.Cookies[key].Domain
= ConfigurationManager.AppSettings[ " domain " ]; // 这里可以保证你的cookie都是顶级域名下的,可以实现二级域名,N级域名登录
}
}

public void Dispose() { }

private void app_AuthenticateRequest( object sender, EventArgs e)
{
// 提取窗体身份验证 cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie
= HttpContext.Current.Request.Cookies[cookieName];

if ( null == authCookie)
{
// 没有身份验证 cookie。
return ;
}

FormsAuthenticationTicket authTicket
= null ;
authTicket
= FormsAuthentication.Decrypt(authCookie.Value);

if ( null == authTicket)
{
// 无法解密 Cookie。
return ;
}
// 创建票证后,为 UserData 属性指定一个
// 以管道符分隔的角色名字符串。
string [] roles = authTicket.UserData.Split( new char [] { ' , ' });


// 创建一个标识对象
FormsIdentity id = new FormsIdentity(authTicket);

// 该主体将通过整个请求。
GenericPrincipal principal = new GenericPrincipal(id, roles);
// 将新的主体对象附加到当前的 HttpContext 对象
HttpContext.Current.User = principal;
}
}
}

web.config设置如下:

  <httpModules>
   <add name="MyHttpModule" type="BLL.MyHttpModule,BLL"></add>
  </httpModules>

这样就启用角色了。然后在web.config里设置:

 <location path="Admin">
  <system.web>
   <authorization>
    <allow roles="admin"/>
    <deny users="*"/>
   </authorization>
  </system.web>
 </location>

表示只允许admin角色成员可以访问Admin目录,即网站管理后台。这是传递角色u.Roles为"admin"即可,多个角色可以用逗号分开。

其他文件中使用User:

调用代码:User.Identity.IsAuthenticated返回用户是否登录,User.IsInRole("admin")返回用户是否属于admin组。以上过程看起来蛮复杂,实际开发好以后,每次只要把相应的文件复制过来即可。非常方便。而且是基于角色的窗体身份验证哦~!安全性非常高。

代码下载:基于角色的窗体身份验证示例代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值