ASP.NET MVC 单点登录(Single Signe On)

一、定义:    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统-【百度百科】

二、非单点登录和单点登录的比较

image


三、在ASP.NET MVC中实现单点登录:(使用Forms身份验证方式)

1.启用单点登录:

单点登录的关键点:必须在所有web 应用程序的配置文件中的System.Web节点中加入MachineKey节点:

    <machineKey validationKey="<MachineKey>" 
                decryptionKey="<DecryptionKey>" validation="<CryptoAlgorithm>" decryption="<CryptoAlgorithm>" />
    <authentication mode="Forms">
      <forms name="SingleSignOn" loginUrl="<SSOLoginURL>" timeout="480" slidingExpiration="true">
       </forms>
    </authentication>

2.创建三个web mvc application:

SSO,Web1,Web2:



3.在SSO中:

添加控制器:AccountController.cs:

namespace SSO.Controllers
{
    public class MyAccountController : Controller
    {
        [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {
            if (Request.IsAuthenticated)
            {
                return RedirectToAction("Index","Home");
            }
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }

        [AllowAnonymous]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(string userName, string password, string returnUrl)
        {
            if (FormsAuthentication.Authenticate(userName, password))
            {
                FormsAuthentication.SetAuthCookie(userName, false);
                if (!string.IsNullOrEmpty(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login details");
                ViewBag.ReturnUrl = returnUrl;
                return View();
            }
        }
    }
}
创建视图Login.cshtml:

@{
  ViewBag.Title = "Login";
}
 
<h2>Login</h2>
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
{
  @Html.ValidationSummary()
  @Html.AntiForgeryToken()
  <div class="form-group">
    @Html.Label("Username")
    @Html.Editor("UserName")
  </div>
  <div class="form-group">
    @Html.LabelForModel("Password")
    @Html.Password("Password")
  </div>
  <input class="btn btn-primary" type="submit" value="Login" />
}

在Web.configsystem.web节点下加入:(machinekey生成方式:https://blogs.msdn.microsoft.com/amb/2012/07/31/easiest-way-to-generate-machinekey/)

 <machineKey validationKey="E4451576F51E0562D91A1748DF7AB3027FEF3C2CCAC46D756C833E1AF20C7BAEFFACF97C7081ADA4648918E0B56BF27D1699A6EB2D9B6967A562CAD14767F163"
                decryptionKey="6159C46C9E288028ED26F5A65CED7317A83CB3485DE8C592" validation="HMACSHA256" decryption="AES" />
    <authentication mode="Forms">
      <forms name="SingleSignOn" loginUrl="http://localhost/SSO/MyAccount/Login" timeout="480" slidingExpiration="true">
        <credentials passwordFormat="SHA1">
          <user name="demo" password="7110eda4d09e062aa5e4a390b0a572ac0d2c0220"/><!--1234-->
        </credentials>
      </forms> 
    </authentication>
设置项目PageUrl:

4.在Web1 和web2中分别创建HomeController:(加上Authorize attribute)

  [Authorize]
public class HomeController : Controller
{
  //
  // GET: /Home/
 
  public ActionResult Index()
  {
    return View();
  }
}
创建Index.cshtml:

@{
    ViewBag.Title = "Web App1 Home";
}
 
<h2>Web App1 Home</h2>
 
Logged in as @User.Identity.Name

@{
  ViewBag.Title = "Web App2 Home";
}
 
<h2>Web App2 Home</h2>
 
Logged in as @User.Identity.Name

5.启动web1,会自动重定向到http://localhost/SSO/Account/Login?ReturnUrl=%2fWebApp1%2f

image

输入用户名和密码,登录成功:
image

再启动Web2,则不会重定向到login 页面,而是到登录成功页面:


image

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值