8

我尝试在我们现有的数据库之上实现 ASP.NET 身份验证和授权。我们有一个网站调用网络服务来获取其数据。要使用网络服务,我需要提供用户名和密码。知道了这一点,我决定实现 IIdentity 和 IPrincipal 来存储加密的密码,并能够在执行 web 服务调用时提供它。将来,我们可能希望更多地使用 asp.net 的内置安全性,因此我实现了成员资格和角色提供程序并覆盖了我所需要的(ValidateUser 和 GetRoles)虽然,在验证用户之后感谢成员资格提供程序实现我仍然将我自己的 CustomIdentity 设置为 Context.User 以便能够在需要时检索其密码。

只要允许用户访问该页面,它就可以完美运行。但是当用户被拒绝时,框架不会抛出 AccessDeniedException,而是在我的 CustomIdentity 上抛出序列化异常。我发现了一个完全相似的行为,并在此链接上描述了更多详细信息,但没有发布任何答案。

我的例外与上面的链接完全相同


Type is not resolved for member'CW.CustomAuthentication.CWIdentity,CW.CustomAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.Serialization.SerializationException: Type is not resolved for member 'CW.CustomAuthentication.CWIdentity,CW.CustomAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[SerializationException: Type is not resolved for member 'CW.CustomAuthentication.CWIdentity,CW.CustomAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.]
   Microsoft.VisualStudio.WebHost.Connection.get_RemoteIP() +0
   Microsoft.VisualStudio.WebHost.Request.GetRemoteAddress() +65
   System.Web.HttpRequest.get_UserHostAddress() +18
   System.Web.HttpRequest.get_IsLocal() +13
   System.Web.Configuration.CustomErrorsSection.CustomErrorsEnabled(HttpRequest request) +86
   System.Web.HttpContext.get_IsCustomErrorEnabled() +42
   System.Web.Configuration.UrlAuthFailedErrorFormatter.GetErrorText(HttpContext context) +16
   System.Web.Security.UrlAuthorizationModule.WriteErrorMessage(HttpContext context) +29
   System.Web.Security.UrlAuthorizationModule.OnEnter(Object source, EventArgs eventArgs) +8777783
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

同时使用成员资格和自定义 IIdentity 和 IPrincipal 是否正确?如果没有,如果我使用成员资格和角色提供者,在哪里添加密码或其他用户数据等属性?

最好的祝福,

斯蒂芬·埃布雷希

4

5 回答 5

8

经过更多测试后,根据我发布的链接所说,似乎只有当我从 Visual Studio 以调试模式运行时才会发生此错误。如果我将项目设置为在 IIS 中运行,则错误消失并且安全实现按预期工作。

---那是在 Visual Studio 中实现的轻量级网络服务器中的错误吗?---

编辑:您可以进入 Web 项目的属性,转到“Web”选项卡,然后选中“使用本地 IIS 服务器”。但是,这将要求您以管理员身份运行 Visual Studio 并在您的计算机上安装 IIS,以便 VS 在加载项目时可以在本地 IIS 服务器中创建虚拟目录。

于 2009-08-17T10:01:00.313 回答
6

就我而言,我只需要继承自MarshalByRefObject.

public class IcmtrIdentity :  MarshalByRefObject, IIdentity
{
   ...
}
于 2012-10-03T13:18:48.977 回答
4

这可能不是正确的答案,但我也遇到了这个问题,但已解决。

最初,我只有一个继承GenericIdentity(或隐含IIdentity)的自定义类。GenericPrincipal当我最终创建了一个继承(或隐含)的自定义类时,IPrincipal这一切都奏效了吗?

我的CustomPrincipal类除了继承自GenericPrincipal并有一个称为基本构造函数的构造函数之外什么也没做。

CustomPrincipal和类都CustomIdentity没有暗示任何Serialization东西ISerializable。再说一次,我的课都是非常基础的。

于 2011-03-21T08:07:10.993 回答
2

您可以进入 Web 项目的属性,转到“Web”选项卡,然后选中“使用本地 IIS 服务器”。但是,这将要求您以管理员身份运行 Visual Studio 并在您的计算机上安装 IIS,以便 VS 在加载项目时可以在本地 IIS 服务器中创建虚拟目录。

尝试使用 CustomIdentity 运行 Web 应用程序时,我遇到了同样的问题。为了将项目设置为在 VS 2008 中使用 IIS,您需要在 Web 应用程序项目中定义应用程序池的 URL。

于 2011-03-07T16:10:47.483 回答
1

这也可以通过将包含您的自定义身份的程序集添加到您的开发计算机上的 GAC 来解决。

于 2013-04-16T01:29:02.963 回答