访问两个网站(使用mvc构建)同时给出错误消息

时间:2011-11-14 06:37:40

标签: asp.net-mvc

我正在尝试同时访问两个网站,这两个网站都是使用MVC构建的。如果我m logged In in one, I can访问另一个。我该如何纠正以下内容?

我收到错误消息:

  

无法验证数据。   描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Web.HttpException:无法验证数据。

来源错误:

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

堆栈追踪:

  

[HttpException(0x80004005):无法验证数据。]
  System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(布尔   fEncrypt,Byte [] buf,Byte []修饰符,Int32 start,Int32 length,   Boolean useValidationSymAlgo,Boolean useLegacyMode,IVType ivType,   布尔符号数据)+4956871
  System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(布尔   fEncrypt,Byte [] buf,Byte []修饰符,Int32 start,Int32 length,   Boolean useValidationSymAlgo,Boolean useLegacyMode,IVType ivType)   +155 System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket)+283
  MvcUI.MvcApplication.FormsAuthentication_OnAuthenticate(对象发送者,   FormsAuthenticationEventArgs args)in   C:\汞柱\ MyProject的\代码\ MvcUI \的Global.asax.cs:40
  System.Web.Security.FormsAuthenticationModule.OnAuthenticate(FormsAuthenticationEventArgs   e)+11497690
  System.Web.Security.FormsAuthenticationModule.OnEnter(Object source,   EventArgs eventArgs)+88
  System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +80 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+270


版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.0.30319.237


为两个应用程序插入相同的计算机密钥后出现新的错误消息

  

值不能为空。   参数名称:value   描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentNullException:值不能为null。 参数名称:值

来源错误:

  

第71行:{第72行:用户=   myProject.API.User.Load(用户名);第73行:                 HttpContext.Current.Cache.Add(key,user,null,System.Web.Caching.Cache.NoAbsoluteExpiration,第74行:new   TimeSpan(0,2,0),System.Web.Caching.CacheItemPriority.Default,   空值);第75行:}

     

[ArgumentNullException:Value不能为null。   参数名称:值]      System.Web.Caching.CacheEntry..ctor(String key,Object value,CacheDependency依赖项,CacheItemRemovedCallback onRemovedHandler,DateTime utcAbsoluteExpiration,TimeSpan slidingExpiration,CacheItemPriority priority,Boolean isPublic)+8942559      System.Web.Caching.CacheInternal.DoInsert(Boolean isPublic,String key,Object value,CacheDependency dependencies,DateTime utcAbsoluteExpiration,TimeSpan slidingExpiration,CacheItemPriority priority,CacheItemRemovedCallback onRemoveCallback,Boolean replace)+93      System.Web.Caching.Cache.Add(String key,Object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration,CacheItemPriority priority,CacheItemRemovedCallback onRemoveCallback)+81      C:\ Dev \ myProject \ Code \ MvcUI \ Global.asax.cs中的MvcUI.MvcApplication.GetUserFromCache(String userName):73      C:\ Dev \ myProject \ Code \ MvcUI \ Global.asax.cs中的MvcUI.MvcApplication.FormsAuthentication_OnAuthenticate(Object sender,FormsAuthenticationEventArgs args):40      System.Web.Security.FormsAuthenticationModule.OnAuthenticate(FormsAuthenticationEventArgs e)+9043237      System.Web.Security.FormsAuthenticationModule.OnEnter(Object source,EventArgs eventArgs)+84      System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+148      System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+75


的Global.asax.cs

  

public class MvcApplication:System.Web.HttpApplication       {           public static void RegisterGlobalFilters(GlobalFilterCollection filters)           {               filters.Add(new HandleErrorAttribute());           }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("WebService/{*pathInfo}");

        routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
    {
        if (FormsAuthentication.CookiesSupported)
        {
            if (null != Request.Cookies[FormsAuthentication.FormsCookieName])
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
                args.User = new myProject.Web.UI.Classes.UserPrincipal(GetUserFromCache(ticket.Name));
            }
        }
        else
            throw new HttpException("Cookieless Forms Authentication is not supported for this application.");
    }

    public void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs args)
    {
        string username = args.Identity.Name.Substring(args.Identity.Name.IndexOf("\\") + 1);
        myProject.API.User user = GetUserFromCache(username);

        if (null == user)
            throw new HttpException("User could not be found.");

        args.User = new myProject.Web.UI.Classes.UserPrincipal(user);
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    private static myProject.API.User GetUserFromCache(string userName)
    {
        string key = "User " + userName;
        myProject.API.User user = (myProject.API.User)HttpContext.Current.Cache[key];
        if (null == user)
        {
            user = myProject.API.User.Load(userName);
            HttpContext.Current.Cache.Add(key, user, null, System.Web.Caching.Cache.NoAbsoluteExpiration,
                    new TimeSpan(0, 2, 0), System.Web.Caching.CacheItemPriority.Default, null);
        }

        return user;
    }
}

3 个答案:

答案 0 :(得分:2)

我猜你在使用表单身份验证?也许两个cookie都是使用相同的域但不同的机器密钥创建的。

因此,当网站A创建cookie(家伙登录)然后你去网站B(未登录)时,网站B查看域名并说他们登录了这个人可以解密数据,但是因为cookie使用MACHINE KEY A加密,失败。

我的2c:)

答案 1 :(得分:1)

我猜是这样的:

1)您的网站使用2种不同的自动生成的MachineKey。 MachineKey是用于编码/解码表单身份验证cookie,哈希密码......的内容的常量键。

2)您在两个应用中使用了相同的applicationName。

3)我猜你也试图在同一台机器上设置测试版网站和制作网站。

答案 2 :(得分:-1)

感谢你们所有人试图回答这个问题。确实他们都很有帮助。我通过在wenconfig中添加一个machinekey来解决问题,并且表单名必须在那里。没有te表单名称,即使机器密钥也没用;