【问题标题】:ASP.NET Authentication and ProviderASP.NET 身份验证和提供程序
【发布时间】:2009-05-08 17:57:53
【问题描述】:

我正在尝试从本地主机上的一个网站导航到本地主机上的第二个网站。

两个网站都有自己的会员提供商。我正在尝试使用来自站点 #1 的 FormsAuthorizationTicket 将用户 SSO 到站点 #2。

目前我收到此错误: System.Security.Cryptography.CryptographicException:填充无效且无法删除

到目前为止,我已采取的步骤包括: 将元素设置为特定的键值 将验证和加密的 machineKey 属性设置为“3DES” 通过日志验证,加密票证在 #2 网站中的值与在 #1 网站中给出的值相同。


我的代码在这里:

        *FormsAuthentication.Initialize();
        FormsAuthenticationTicket newTicket = new 
            FormsAuthenticationTicket(1 // Ticket Version
            , Login1.UserName                       // User Name
            , DateTime.Now                          // Creation Date
            , DateTime.Now.AddDays(1)   // Expiration Date
            , true                                              // Is Persistant
            , Login1.UserName);                 // This should be a list of Roles


        string strEncyptedTicket = FormsAuthentication.Encrypt(newTicket);
        HttpCookie myCookie = new HttpCookie("cryptCookie", strEncyptedTicket);
        myCookie.Values.Add("username", Login1.UserName);
        myCookie.Values.Add("cryptTick", strEncyptedTicket);
        Response.Cookies.Add(myCookie);*

在网站 #2 中,我创建了一个登录页面来验证票证并重定向到仅限会员的页面。解密期间是我收到上面指定的错误。

这是我在网站 #2 上的着陆页代码:


        *FormsAuthenticationTicket fat2 = FormsAuthentication.Decrypt(Request.Cookies["cryptCookie"].Values["cryptTick"]);


        MembershipUser mu = Membership.GetUser(Request.Cookies["cryptCookie"].Values["username"]);
        if (mu == null)
        {
            lblInfo.Text += "member not found";
            return;
        }

        Response.Redirect(@"~\MemberPages\MemberPage.aspx");*

如果有人有想法可以提供帮助,我很乐意尝试。

【问题讨论】:

    标签: asp.net authorization sqlmembershipprovider


    【解决方案1】:

    两个站点需要共享相同的machine key

    【讨论】:

    • 我的机器密钥在我的 machine.config 文件中定义,我相信这两个网站都继承了该文件(因为两者都在我的本地主机上)。我还需要做些什么来满足这个要求吗?
    • 这更像是一种观察而非答案。如果您在 VS 中使用内置 IIS(即 localhost:3123/yoursite),我认为它们不会共享 cookie。从长远来看,跨域(mysite1.com 到 yoursite3.net)会遇到问题
    【解决方案2】:

    Ian 是正确的,因为您的网站需要有一个匹配的机器密钥。此外,您需要确保您的会员提供商具有相同的设置,尤其是在密码加密方面。

    另外,您为什么要完全在代码中处理这个问题?您应该能够使用两个站点的 Web.Config 非常轻松地配置此功能。从本质上讲,您正在做大量的返工并在不必要的地方引入潜在的问题区域(除非您有理由在此处未说明)。

    【讨论】:

    • 我在代码中处理这个,因为我不确定如何在 web.config 中做到这一点。这是两个独立的网站,未来将在两个不同的域上使用不同的会员提供商。本质上,我想让站点 #1 授权用户,然后在票证中传递角色值,以便站点 #2 知道允许该用户使用什么功能。根据我的阅读,这无法在网络配置中处理。你能引导我在 web.config 中解决这个问题吗?
    • 如上所述,如果您的网站位于两个不同的域(不仅仅是子域)上,您将无法在它们之间共享任何 cookie。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2018-12-20
    相关资源
    最近更新 更多