关于身份验证:在ASP.NET中使用没有登录控件的自定义MembershipProvider

关于身份验证:在ASP.NET中使用没有登录控件的自定义MembershipProvider

Using Custom MembershipProvider without a Login control in ASP.NET

我们在ASP.NET中有一个自定义的MembershipProvider。现在有两种可能的情况可以验证用户:

  • 通过login.aspx页面输入用户名/密码登录。我已经使用了登录控件并将其与MyMembershipProvider链接。这工作得很好。

  • 身份验证令牌通过查询URL中的某些URL从其他网站传递。为此,我在MembershipProvider.Validate(string authenticationToken)中有一个重载,它实际上是在验证用户。在这种情况下,我们不能使用登录控件。现在,如何在不实际使用登录控件的情况下使用相同的MembershipProvider来验证用户?我尝试手动调用Validate,但这未使用户登录。

  • 这是我正在使用的代码段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (!string.IsNullOrEmpty(Request.QueryString["authenticationToken"])) {
        string ticket = Request.QueryString["authenticationToken"];
        MyMembershipProvider provider = Membership.Provider as MyMembershipProvider;
        if (provider != null) {
            if (provider.ValidateUser(ticket))
                // Login Success
            else
                // Login Fail
        }
    }

    验证成功后,您需要通过调用FormsAuthentication.Authenticate登录用户:http://msdn.microsoft.com/zh-cn/library/system.web.security.formsauthentication.authenticate.aspx <铅>

    编辑:这是FormsAuthentication.SetAuthCookie:
    http://msdn.microsoft.com/zh-CN/library/twk5762b.aspx

    此外,要将用户重定向到他想去的地方,请致电:FormsAuthentication.RedirectFromLoginPage:http://msdn.microsoft.com/zh-cn/library/system.web.security.formsauthentication.redirectfromloginpage.aspx <铅>

    链接文字


    如果验证成功,则可以设置自己的FormsAuthenticationTicket

    像这样的东西;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if (provider != null) {
        if (provider.ValidateUser(ticket)) {
            // Login Success
            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                1, //version
                someUserName, //name
                DateTime.Now, //issue date
                DateTime.Now.AddMinutes(lengthOfSession), //expiration
                false, // persistence of login
                FormsAuthentication.FormsCookiePath
            );

            //encrypt the ticket
            string hash = FormsAuthentication.Encrypt(authTicket);
            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);

            Response.Cookies.Add(cookie);
            Response.Redirect(url where you want the user to land);
        } else {
            // Login Fail  
        }  
    }

    在将身份验证信息直接存储为cookie的情况下,您是正确的。但是使用强大的哈希函数(例如MD5 SHA1)既安全又好用。
    顺便说一句,如果您使用会话(也只是一个哈希cookie),则可以向其附加身份验证信息。


    推荐阅读