在ASP.NET中使用自定义MembershipProvider而不使用Login控件

时间:2008-09-03 13:24:56

标签: asp.net authentication

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

  1. 用户通过输入用户名/密码登录login.aspx页面。我使用了登录控件并将其与MyMembershipProvider相关联。这完全正常。

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

  3. 以下是我正在使用的代码段

    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
        }
    }
    

3 个答案:

答案 0 :(得分:13)

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

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

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

link text

答案 1 :(得分:4)

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

像这样;

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  
    }   
}

答案 2 :(得分:1)

如果将身份验证信息直接存储为cookie,您就是正确的。但是使用强哈希函数(例如MD5 + SHA1)非常安全。 顺便说一句,如果您使用会话(也只是一个哈希cookie),您可以附加身份验证信息。