简体   繁体   中英

Custom login mechanism for a ASP.NET website

I'm working on a ASP.NET website and I need to get away with some custom but simple login mechanism. I started from the famous Employee Info Starter Kit

Here's what I have so far:

On a ASP.NET page:

protected void ButtonLogOn_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(txtUserName.Value) || String.IsNullOrEmpty(txtPassword.Value))
        labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
    else
    {
        //if the log-in is successful
        LoginPage LoginBack = new LoginPage();

        if (LoginBack.VerifyCredentials(txtUserName.Value, txtPassword.Value) == 0)
        {
            SiteLogin.PerformAuthentication(txtUserName.Value, checkBoxRemember.Checked);
        }
        else
        {
            labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("<strong>Login Failed!</strong><hr/>The username and/or password you entered do not belong to any User account on our system.<br/>You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
        }
    }
}

protected void ButtonAdminLogOn_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(txtUserName.Value) || String.IsNullOrEmpty(txtPassword.Value))
        labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("<strong>Login Please!</strong><hr/>You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
    else
    {
        //if the log-in is successful
        if (txtUserName.Value == "admin" && txtPassword.Value == "123123")
        {
            SiteLogin.PerformAdminAuthentication("admin", checkBoxRemember.Checked);
        }
        else
        {
            labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("<strong>Login Failed!</strong><hr/>The username and/or password you entered do not belong to any Administrator ccount on our system.<br/>You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
        }
    }
}

And a utility class

public static void PerformAuthentication(string userName, bool remember)
{
    FormsAuthentication.RedirectFromLoginPage(userName, remember);

    if (HttpContext.Current.Request.QueryString["ReturnUrl"] == null)
    {
        RedirectToDefaultPage();
    }
    else
    {
        HttpContext.Current.Response.Redirect(HttpContext.Current.Request.QueryString["ReturnUrl"]);
    }
}

public static void PerformAdminAuthentication(string userName, bool remember)
{
    FormsAuthentication.RedirectFromLoginPage(userName, remember);

    if (HttpContext.Current.Request.QueryString["ReturnUrl"] == null)
    {
        RedirectToAdminDefaultPage();
    }
    else
    {
        HttpContext.Current.Response.Redirect(HttpContext.Current.Request.QueryString["ReturnUrl"]);
    }
}

My login form has two buttons: The Admin login is hard-coded name/password. The normal login routine goes back to another assembly that calls a web service and get the username and password checked against a domain login.

Now, there is one other file that has code and is baffling me.

Global.asax

<script RunAt="server">
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    if (HttpContext.Current.User != null)
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            if (HttpContext.Current.User.Identity.AuthenticationType != "Forms")
            {
                throw new InvalidOperationException("Only forms authentication is supported, not " +
                        HttpContext.Current.User.Identity.AuthenticationType);
            }

            IIdentity userId = HttpContext.Current.User.Identity;

            //if role info is already NOT loaded into cache, put the role info in cache
            if (HttpContext.Current.Cache[userId.Name] == null)
            {
                string[] roles;

                if (userId.Name == "admin")
                {
                    roles = new string[1] { "administrators" };
                }
                else if (userId.Name == "member1")
                {
                    roles = new string[1] { "employees" };
                }
                else
                {
                    roles = new string[1] { "public" };
                }

                //1 hour sliding expiring time. Adding the roles in cache. 
                //This will be used in Application_AuthenticateRequest event located in Global.ascx.cs 
                //file to attach user Principal object.
                HttpContext.Current.Cache.Add(userId.Name, roles, null, DateTime.MaxValue, TimeSpan.FromHours(1), CacheItemPriority.BelowNormal, null);
            }

            //now assign the user role in the current security context
            HttpContext.Current.User = new GenericPrincipal(userId, (string[])HttpContext.Current.Cache[userId.Name]);
        }
    }

}
</script>

The website has a few About pages that allow free access but the rest is either for admin or employee. My admin username/password is fixed but the employee login is entered in domain format and needs to be verified on target domain (all being done) and then set the employee role.

How am I to do that in the Application_AuthenticateRequest method in Global.asax file?

Set different auth modes for different folders (via Web.config or even just IIS snap-in ):

  • Anonymous for root (with about pages)
  • Forms auth for ~/Admin area
  • Windows/NTLM for ~/Employers area

Also you can use extended Login control with custom Membership provider .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM