无法转换类型为#System; Security.Principal.GenericIdentity'的对象。输入' System.Web.Security.FormsIdentity'

时间:2013-12-05 13:07:33

标签: c# asp.net form-authentication

我在网站登录期间收到此错误。如何解决此问题。enter image description here

4 个答案:

答案 0 :(得分:10)

显然,与当前请求相关联的主要对象是GenericIdentity而不是FormsIdentity。这两者之间的铸造是不可能的。

您应该仔细检查应用程序的堆栈,了解身份管理模块以及代码中为当前请求设置标识的所有其他可能位置。如果你能够确定设置GenericIdentity的罪魁祸首 - 你已经完成了,你可以重写/重新设计这个特定的位置。

我的猜测是,当用户未经过身份验证时会出现此问题。运行时为当前请求创建GenericIdentity,并将IsAuthenticated设置为false。我将代码重写为:

 if ( HttpContext.Current.User != null && HttpContext.Current.User.Identity is FormsIdentity )
 {
    // your code follows
 }
 else
 {
    // the user is not yet authenticated and 
    // there is no Forms Identity for current request
 }

答案 1 :(得分:2)

异常会告诉您在此处需要了解的所有内容,FormsIdentity无法转换为GenericIdentity,因为它们是完全不同的两个类。

您实际上并没有提供任何关于为什么投射的信息,但是,这两种类型之间的公共基类是ClaimsIdentity,例如。

var identity = (ClaimsIdentity)HttpContext.Current.User.Identity;

答案 2 :(得分:2)

我遇到了这个问题,因为我忘记在使用表单身份验证的Web应用程序的入口点上使用[Authorize]属性。入口点试图将User.IdentityGenericIdentity投射到FormsIdentity并失败。

在我的ASP.NET MVC控制器中,我有以下代码;

public ActionResult Index(long? eventID)
{
     // error occurred here
     FormsIdentity id = (FormsIdentity)HttpContext.User.Identity;    
}

更改为此强制在我的web.config中设置的身份验证方法;

<authentication mode="Forms">

更新了代码;

[Authorize]
public ActionResult Index(long? eventID) { 

   FormsIdentity id = (FormsIdentity)HttpContext.User.Identity; 

}

答案 3 :(得分:0)

当用户未经过身份验证时会发生此问题:您从浏览器中删除了Cookie,并且无需登录即可直接访问该网址。