我是Web开发的初学者。所以,请理解我。 我想使用c#创建会话或路由,就像在php中一样。 这就是示例逻辑。
if (SESSIONHasValue = True){
//The User can Access the whole website;
}else{
//Maintain to LOGIN PAGE of the Website;
}
我想创建一个功能,即使用户在chrome的地址栏中键入索引页面的地址,也可以以登录形式重定向用户。 我已经像我一样看到了这个问题,但这是我需要的相同功能吗? Create session in C#
如果您可以教我如何使用它进行创建。请帮忙。
致谢
答案 0 :(得分:1)
我将向您展示在.NET MVC中使用Session
的非常基本的示例。首先,您必须设置您的登录模型,该模型基本上是您要求用户在登录过程中输入的字段。就我而言,我假设基本属性为username
和password
:
namespace MyExample.Models
public class LoginRequestModel
{
public string UserName { get; set; }
public string Password { get; set; }
}
现在,当您向用户显示Login
页面时,您会将这些模型属性传递给视图。我更喜欢使用强类型的Model-View体系结构,但是您可以使用其他方法(例如AJAX或FormData)将表单变量处理到控制器中。现在,在Login
控制器下的Login
方法中,我像这样传递模型:
using MyExample.Models
namespace MyExample.Controllers
{
public class LoginController : Controller
{
public ActionResult Login()
{
return View(new LoginRequestModel());
}
}
}
请注意我将LoginRequestModel
类放入的名称空间。您将需要在控制器中声明该名称空间,否则会出现错误。进入我们的程序,以上方法将初始化LoginRequestModel
的新实例并将其发送到您的View,您将能够使用@Html
helper扩展将其绑定到HTML。它们采用Razor
语法,在处理表单方面非常出色。
现在,要在视图中访问模型,请执行以下步骤:
@using MyExample.Models
@model LoginRequestModel
<html lang="en">
<head>
<!-- Your scripts and associated links go in this section -->
</head>
<body>
@using (Html.BeginForm("Authenticate", "Login", FormMethod.Post, new {role = "form", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div>
@Html.TextBoxFor(m => m.UserName, new { @id = "exampleInputUsername", @required = "required", @placeholder = "Enter User ID", @autocomplete = "off" })
</div>
<div>
@Html.TextBoxFor(m => m.Password, new { @id = "exampleInputPassword", @required = "required", @placeholder = "Enter Password", @autocomplete = "off", @type = "password" })
</div>
<button type="submit">Login</button>
}
</body>
</html>
这将创建一个具有两个输入文本框和一个提交按钮的视图。文本框已绑定到您的模型属性UserName
和Password
。现在,如果您会注意到以下行:Html.BeginForm("Authenticate", "Login", FormMethod.Post,
,将告诉表单将发送到的Authenticate
方法您的Login
控制器使用POST请求。另外,如果您会看到以下行:@Html.AntiForgeryToken()
,则可以进一步了解here。这基本上可以通过验证令牌来防止对表单进行任何CSRF攻击。您可以根据需要添加JQuery
验证并使用CSS
设置视图样式。
主要部分现在到了。当您填写此表单并点击Submit时,路由将在Authenticate
控制器中搜索Login
方法。因此,我们需要在控制器内部创建此方法。
using MyExample.Models
using System.Net.Http;
using System;
namespace MyExample.Controllers
{
public class LoginController : Controller
{
public ActionResult Login()
{
return View(new LoginRequestModel());
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Authenticate(LoginRequestModel loginRequest)
{
//Apply your authentication logic here
bool result = someMethodToAuthenticate(loginRequest)
if(result==true)
{
//Setup your session variables here
Session["UserName"] = loginRequest.UserName;
Session["TimeLoggedIn"] = DateTime.Now;
return RedirectToAction("View Where You Want To Redirect", "Controller Where the View is");
}
else
{
ViewBag.setError = "Invalid login credentials supplied";
return View("InvalidLogin");
}
}
}
}
请注意,我已经导入了命名空间System.Net.Http
,该命名空间包含当前HTTP请求的Session对象。编写身份验证逻辑后,根据结果,您可以设置会话变量,如上所示。您可以在程序生命周期的任何地方使用这些变量,只要不破坏它们即可。您可以通过以下方式访问会话变量:string loggedInUser=Session["UserName"];
。为了销毁会话变量,您可以执行以下操作:
public ActionResult Logout()
{
Session.Abandon();
Session.Clear();
return RedirectToAction("Login", "Login");
}
您还可以删除特定的会话变量,例如:Session.Remove("UserName");
为了检查会话,您可以执行以下操作:
public ActionResult SessionCheck()
{
string message = string.Empty;
if (Session["UserName"] == null)
{
message = "Session expired. Please Login again";
}
return Json(message, JsonRequestBehavior.AllowGet);
}
您可以在整个程序中使用AJAX
来检查此方法,也可以使用SessionState。
AJAX示例:
function IsSessionActive()
{
var url ="/Login/SessionCheck";
var param = {};
param = JSON.stringify(param);
var result = getResultPost(url, param);
if (result != "")
{
alert("Session has expired, Please login again");
return true;
}
}
function getResultPost(url, param) {
var result;
$.ajax({
url: url,
type: "POST",
async: false,
dataType: "json",
data: param,
contentType: "application/json; charset=utf-8",
success: function (data, textStatus) {
result = data;
},
error: function (e) {
result = "Error";
}
});
return result;
}
最后在您的视图中调用它,就像这样:
$(document).ready(function () {
if (IsSessionActive()) return false;
})
干杯。