最近在看JA-SIG CAS单点登录,感觉有几点疑问?

1.使用JA-SIG CAS(或者其他类似软件)时候,到具体网址里面的权限改怎么控制,是在每个具体网站中新建一个用户表然后用户与单点登录的用户绑定?单点登录系统中是否可以带权限到具体网站中?

2.对于用户的角色、部门等用户基本信息在所有网站中都是一样这些东西是否可以单独出来?(不知道怎么放,放哪里?)

推荐图书

  • C#与.NET 4高级程序设计(第5版)


1个回答

login.aspx : 登录页面

logout.aspx: 用来处理用户注销 (非必需,但建议把注销逻辑放在这里,以便任何需要注销的地方重复利用)

default.aspx: 登录完成后的显示页面

gotoUrl.aspx : 登录完成后,用来辅助做页面跳转的页面(非必需,但建议加上)

web.config:配置用户认证的方式(Forms),和浏览目录权限

Global.ascx:每个aspx页面在请求认证时,都会触发Application_AuthenticateRequest事件

login.aspx代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="login.aspx.cs" Inherits="WebApplication2.login" %>

<!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 id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <table>
        <tr>
            <td>
                用户名:
            </td>
            <td>
                <asp:TextBox ID="txtUserName" runat="server" Style="width: 200px"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td>
                密 码:
            </td>
            <td>
                <asp:TextBox ID="txtPassword" runat="server" TextMode="Password" Style="width: 200px"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td>
            </td>
            <td>
                <asp:Button ID="Button1" runat="server" Text="登 录" OnClick="Button1_Click" />
            </td>
        </tr>
    </table>
    </form>
</body>
</html>

后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

namespace WebApplication2
{
    public partial class login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string user = this.txtUserName.Text; //读取用户名
            string password = this.txtPassword.Text; //读取密码
            if (ValidateUser(user, password) == true) //ValidateUser方法用来验证用户合法性的
            {

                //建立表单验证票据
                FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, user, DateTime.Now, DateTime.Now.AddMinutes(30), true, "管理员,会员", "/");

                //使用webcongfi中定义的方式,加密序列化票据为字符串
                string HashTicket = FormsAuthentication.Encrypt(Ticket);

                //将加密后的票据转化成cookie
                HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);

                //添加到客户端cookie
                Context.Response.Cookies.Add(UserCookie);

                //登录成功后重定向
                Response.Redirect("GotoUrl.aspx?returnUrl=" + Server.UrlEncode("Default.aspx"));
             }
             else
             {
                //登录失败后的处理
             }           
        }



        /// <summary>
        /// 验证用户名/密码是否正确
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="pwd"></param>
        /// <returns></returns>

        private bool ValidateUser(string userName, string pwd)
        {
            return true; //当然实际开发中,您可以到数据库里查询校验,这里只是示例而已
        }

    }

GotoUrl.aspx:这个页面只是单纯的辅助跳转而已,所以aspx页面本身不用加什么代码,只需要在后置cs代码里简单处理一下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public partial class gotoUrl : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string _returnUrl = Request["returnUrl"];
            if (string.IsNullOrEmpty(_returnUrl))
            {
                _returnUrl = "~/default.aspx";
            } 
            Response.Redirect(_returnUrl);
        }
    }
}

接下来应该是Default.aspx了,这里只是演示,所以没有后置代码,判断的逻辑全写在default.aspx本身:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="WebApplication2._default" %>

<!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>
        <% if (User.Identity.IsAuthenticated)
           {
               Response.Write("<span style='color:red'>" + User.Identity.Name + "</span>已登录!");
               if (User.IsInRole("管理员"))
               {
                   Response.Write(" 当前用户角色:管理员");
               }
               if (User.IsInRole("会员"))
               {
                   Response.Write(",会员。");
               }
               Response.Write(" <a href='logout.aspx'>安全退出</a>");

           }
           else
           {
               //Response.Write("请先<a href='login.aspx'>登录</a>");
           }
        %>
    </div>
    </form>
</body>
</html>

注销页面logout.aspx,类似的,这个页面本身只负责注销cookie票据,所以界面上没东西,只有后置代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

namespace WebApplication2
{
    public partial class logout : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            //注销cookie票据(从浏览器删除Forms身份验证)
            FormsAuthentication.SignOut();
            Response.Redirect("default.aspx");
        }
    }
}

web.config文件

<?xml version="1.0" encoding="utf-8"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细消息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>

  <!--,“?”的意思指匿名用户,而“*”则表示所有用户。
  下面这个意思就是说根目录下的所有页面拒绝被匿名用户访问。
  当然你也可以在users中填写指定的用户ID,不过那样并不常用。
  还有deny,allow的顺序是先写allow完了再deny,不然就会出现问题。
  这个大家要记住。-->
  <location path="">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
      <forms
         name=".ASPXAUTH"
         loginUrl="login.aspx"
         timeout="30"
         path="/"
         requireSSL="false"
         domain="">
      </forms>
    </authentication>

  </system.web>  
</configuration>