问题
I just learn about ASP.NET MVC. I hava a website with this following scenario:
Login -> Main Page (Index) -> Edit Page (Edit)
So, In LoginController
when user login, it will redirect to main page
and edit a record from MainPage
.
Everytime a new record is created through ASP.NET MVC, the system will send an email to manager. Within email message, there is a hyperlink that will redirect the manager to edit form. But first, he needs to login because the edit form cant be opened unless he login. Ex:
http://localhost:1212/Main/Edit/ID-001
I have add Authorize Attribute
within MainController
. But It's only work for Main Page
. So I can open Edit Page
even I am not login yet.
Here is the MainController:
[Authorize]
public class MainController : Controller
{
string connString = @"Data Source=DESKTOP-FSET3FF,1433; Initial Catalog=INOVA_Data; User Id=sa; Password=Copoe113";
public ActionResult Index(string username)
{
if (Session["username"] != null)
{
string user = Session["username"].ToString();
SqlConnection conn = new SqlConnection(connString);
conn.Open();
string sqlQuery = @"select Animals, Gender from dbo.Animals where Pemilik = @user";
//string h = x => x.
SqlCommand cmd = new SqlCommand(sqlQuery, conn);
cmd.Parameters.AddWithValue("@user", user);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
conn.Close();
return View(dt);
}
else
{
return RedirectToAction("Login", "Login");
}
}
public ActionResult Edit()
{
return View();
}
}
The Second Question, Above I have write my website scenario, that is
Login-> MainPage (Index) -> EditPage (Edit)
Based On Hyperlink On Email, How to make application Redirect to EditPage without redirect to MainPage.
Login -> EditPage (Edit)
EDITED 2nd question
In short, when user's trying to access edit view directly, the application will redirect user to login view. And when heelr login success , the application will redirect user to Edit View.
But now, when login success, the system will redirect the user to main view. How to make the application redirect to edit view after login ?
回答1:
Important note : (Based on @Tashi Comment, I added this note) If you are use mvc basic application with admin panel than do not worry about the authentication and authorization for whole application with session management.
This is we need when we explicitly use our customization of app and that has to be implement in every controller. Rather than use direct controller for inheritance i.e. MainController : Controller
, use custom controller where you check authentication.
/*You have to inherit this basecontroller in every controller*/
public class MainController : BaseController
{
your actionmethods
}
And BaseController like
public class BaseController : Controller
{
public BaseController()
{
if (string.IsNullOrEmpty(SessionManager.SiteUrl))
{
SessionManager.SiteUrl = ConfigurationManager.AppSettings["SiteUrl"].ToString();
}
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (SessionManager.UserId == -1)
{
switch (filterContext.ActionDescriptor.ActionName.ToLower().Trim())
{
case "addeditcontact":
ViewBag.hdnPopupLogout = "0";
return;
default:
filterContext.Result = new RedirectResult(Url.Action("Login", "Home"));
break;
}
}
}
}
Add another property class for session management
public class SessionManager
{
public static int UserId
{
get
{
if (HttpContext.Current.Session["UserId"] != null)
{
return Convert.ToInt32(HttpContext.Current.Session["UserId"]);
}
else return -1;
}
set
{
HttpContext.Current.Session["UserId"] = value;
}
}
public static string UserName
{
get
{
if (HttpContext.Current.Session["UserName"] != null)
{
return Convert.ToString(HttpContext.Current.Session["UserName"]);
}
else return string.Empty;
}
set
{
HttpContext.Current.Session["UserName"] = value;
}
}
//reset user detail and add your custom property
public static void SignOutUser()
{
UserId = -1;
UserName = string.Empty;
}
}
While login set userid in session variable in HomeController like
public ActionResult Login()
{
if (SessionManager.UserId == -1)
{
HttpCookie cookie = Request.Cookies["Login"];// Request.Cookies["Login"];
if (cookie != null)
{
ViewBag.hdnUserID = cookie.Values[0];
ViewBag.hdnPassword = cookie.Values[1];
ViewBag.hdnRemember = "true";
}
return View("Login");
}
else
{
return RedirectToAction("Index", "Home");
}
}
Now this is your architecture ready, I will give your answer
- This above things prevent unauthorized access, if there is no user without authentication.
- Now second question is redirect to edit page when hyperlink click. for this while define hyperlink, either create actionmethod to redirect or you can use javascript / ajax method (For authenication) to redirect page.
You need to design html at your end for grid. As this below image.
and above last td of cell in html render as this
<td width="25%" >
<a title="Edit" style="cursor:pointer" onclick="popupContacts(-2147481891,false );">Edit</a>
<a style="cursor:pointer" title="Associate With Client" onclick="popupAssociateClient(-2147481891 );">Associate With Client</a>
<a style="cursor:pointer" title="Update Contacts" onclick="popupUpdateContacts(-2147481891 );">Update Contacts</a> <a style="cursor:pointer" title="Export VCF" onclick="ExportContacttoVcf(-2147481891 );">Export VCF</a>
</td>
for js, redirect to another page, where we first check that user have proper rights else redirect to login in actionmethod.
function popupContactsDetails(clientid, contype) {
window.location.href = URL + "Home/ShowEditContact?Id=" + clientid + ",contype=" + contype;
}
OR You can use the same function as(may be some thing wrong in code as I maniputlate code to publish here, but understand the concept behind this)
function popupContactsDetails(clientid, contype) {
$.ajax({
url: URL + "Home/ShowEditContact?Id=" + clientid + ",contype=" + contype,
type: 'get',
dataType: 'json',
async: false,
// data: ko.toJSON(this),
contentType: 'application/json',
success: function (result) {
if (result = null) {
alert("you are access wrong page);
window.location.href = URL + "Home/login;
} else{
window.location.href = URL + "Home/yourpageurl;
}
}
});
}
来源:https://stackoverflow.com/questions/45929947/open-specified-asp-net-mvc-views-from-hyperlinks-inside-email-body