- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题如果我使用 GUID,Membership.GetUser 工作正常,但如果我在没有参数或名称的情况下尝试它会失败:
//This works and adds records to aspnet_user & aspnet_Membership tables
MembershipUser membershipUser = Membership.CreateUser(_name, _pwd, _email, null, null, true, null, out createStatus);
//These fail with an InvalidCastException
MembershipUser membershipUser2 = Membership.GetUser(_name, true);
MembershipUser membershipUser3 = Membership.GetUser();
//If I go look up the GUID for this user (userId), this works!
MembershipUser membershipUser4 = Membership.GetUser(new Guid("E1428CD3-CF17-494E-AB77-CF8F6010F585"), true);
其他谜团
//This works
Int32 count = Membership.GetNumberOfUsersOnline();
//this fails (but totalRecords has the right value)
Int32 totalRecords;
MembershipUserCollection col = Membership.GetAllUsers(0,100, out totalRecords);
设置
例如:
<membership defaultProvider="SqlProvider">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="MyDB"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="myapp"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="2"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
异常详情
Specified cast is not valid.
at System.Data.SqlClient.SqlBuffer.get_SqlGuid()
at System.Data.SqlClient.SqlDataReader.GetGuid(Int32 i)
at System.Web.Security.SqlMembershipProvider.GetUser(String username, Boolean userIsOnline)
at System.Web.Security.Membership.GetUser(String username, Boolean userIsOnline)
想法
这几乎就像 Membership.GetUser 方法中有问题。我为我的 System.Web.dll(版本 4.0)反射(reflect)了 System.Web.Security.SqlMembershipProvider.GetUser 的代码,我得到以下信息:
public override MembershipUser GetUser(string username, bool userIsOnline)
{
SecUtility.CheckParameter(ref username, true, false, true, 256, "username");
SqlDataReader reader = (SqlDataReader) null;
try
{
SqlConnectionHolder connectionHolder = (SqlConnectionHolder) null;
try
{
connectionHolder = SqlConnectionHelper.GetConnection(this._sqlConnectionString, true);
this.CheckSchemaVersion(connectionHolder.Connection);
SqlCommand sqlCommand = new SqlCommand("dbo.aspnet_Membership_GetUserByName", connectionHolder.Connection);
sqlCommand.CommandTimeout = this.CommandTimeout;
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.Add(this.CreateInputParam("@ApplicationName", SqlDbType.NVarChar, (object) this.ApplicationName));
sqlCommand.Parameters.Add(this.CreateInputParam("@UserName", SqlDbType.NVarChar, (object) username));
sqlCommand.Parameters.Add(this.CreateInputParam("@UpdateLastActivity", SqlDbType.Bit, (object) (bool) (userIsOnline ? 1 : 0)));
sqlCommand.Parameters.Add(this.CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, (object) DateTime.UtcNow));
SqlParameter sqlParameter = new SqlParameter("@ReturnValue", SqlDbType.Int);
sqlParameter.Direction = ParameterDirection.ReturnValue;
sqlCommand.Parameters.Add(sqlParameter);
reader = sqlCommand.ExecuteReader();
if (!reader.Read())
return (MembershipUser) null;
string nullableString1 = this.GetNullableString(reader, 0);
string nullableString2 = this.GetNullableString(reader, 1);
string nullableString3 = this.GetNullableString(reader, 2);
bool boolean1 = reader.GetBoolean(3);
DateTime creationDate = reader.GetDateTime(4).ToLocalTime();
DateTime lastLoginDate = reader.GetDateTime(5).ToLocalTime();
DateTime lastActivityDate = reader.GetDateTime(6).ToLocalTime();
DateTime lastPasswordChangedDate = reader.GetDateTime(7).ToLocalTime();
Guid guid = reader.GetGuid(8);
bool boolean2 = reader.GetBoolean(9);
DateTime lastLockoutDate = reader.GetDateTime(10).ToLocalTime();
return new MembershipUser(this.Name, username, (object) guid, nullableString1, nullableString2, nullableString3, boolean1, boolean2, creationDate, lastLoginDate, lastActivityDate, lastPasswordChangedDate, lastLockoutDate);
}
finally
{
if (reader != null)
reader.Close();
if (connectionHolder != null)
connectionHolder.Close();
}
}
catch
{
throw;
}
}
下一步
我希望从 SO 人群那里得到一些关于我下一步应该去哪里的指导。我认为我可以覆盖此方法并将我自己的提供程序放在一起只是为了调试它,或者我可以绕过该死的事情并直接自己调用数据库。这似乎是一些基本的数据库 CRUD 带来的很多心痛。
当前状态
aspnet_Users
表有 UserId
作为 nvarchar(256)
而不是唯一标识符
。也许 SqlDataReader.GetGuid()
在那里窒息。今晚我将进行一些测试,看看是否是问题所在。我想知道我的表结构是否已过时,因为在线文档将此字段显示为 uniqueidentifier
。 最佳答案
为什么要使用 membership.CurrentUserName()
?您可以只使用 HttpContext.Current.User.Identity.Name;
关于c# - SqlMembershipProvider Membership.GetUser 按名称失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215963/
我在一个由开发人员组成的小团队中工作,对于完成许多核心任务的最佳方法没有达成共识,其中一个是成员(member)提供者。现在我无法确定这是否与缺乏对替代思维方式或足够规模的项目的接触以保证进行重大调查
在哪里可以找到 SQLMembershipProvider (.NET2.0) 的源代码? 是可用的么? 最佳答案 源代码已经发布。 See ScottGu's blog for further de
在我着手编写自己的解决方案来解决这个问题之前,任何人都可以向我指出一个预构建的解决方案,用于在使用 SqlMembershipProvider 时管理标准用户详细信息吗?我通过 Google 找到的解
我有一个即将开展的项目,将与 70,000 多个用户(教育)打交道。我想知道 ASP.NET SqlMembership Provider 是否已经以如此大的容量使用过?假设硬件在那里,是否需要做一些
我们正在将我们的用户身份验证从提供的 .NET 实现迁移到我们自己的系统。 我们希望能够支持存在于 aspNet_Membership 表中的旧密码。 Password 和 Salt 位于该表中,因此
我正在使用 SqlMembershipProvider 并将我的密码存储为哈希值。我还在另一个表中保留了(散列)密码的历史记录。我希望能够将用户尝试更改密码的密码与旧密码进行比较,如果密码太新则抛出错
如何禁用 的帐户锁定功能SqlMembershipProvider ? MaxInvalidPasswordAttempts 的 MSDN 文档属性没有指定如何禁用它。如果我找不到正确的方法,我会将
我正准备开始构建一个新的 asp.net 项目,我才刚刚开始使用 SQLMembershipProvider 的全部内容。我真正想做的是消除对用户名的需求,只需要用户的 key 作为电子邮件地址。 在
这是场景: 我使用默认的 SqlMembershipProvider 在网站上实现 membershp。现在我想迁移到我的自定义成员资格提供商。 (仅供引用,我使用的是 CodeFirst Membe
问题如果我使用 GUID,Membership.GetUser 工作正常,但如果我在没有参数或名称的情况下尝试它会失败: //This works and adds records to aspnet
我试图获取使用 SqlMembershipProvider 在 MiniProfiler 中显示时发生的任何数据库查询,但我想不出任何方法来交换 SqlConnection 与 ProfiledDbC
我们正在迁移到生产环境,我想编写一个脚本,让 DBA 在运行我使用 aspnet_regsql 生成的脚本后可以立即创建具有角色的用户。在开发环境中,我一直在 Global.asax.cs 中使用成员
我正在使用 ASP.NET SqlMembershipProvider 在 Web 应用程序上实现授权,但它在调用 GetUser 方法时随机抛出无效的强制转换异常。 我可以登录并浏览页面,一切都很好
我想创建一个仅供员工在内部使用的网络应用程序(网站)。 我想使用事件目录成员提供程序来验证用户。令我困惑的是如何管理配置文件和角色,以及如何将具有 FK 的用户链接到其他表。 到目前为止,我正在考虑做
在 ASP.NET 成员资格的 SQLMembershipProvider 源中,有一个自定义异常 MembershipPasswordException。 它的定义不是源代码的一部分,但是当我对其进
我正在使用 Visual Studio 2008 SP1 和 C# 开发一个 ASP.NET 应用程序。我也在使用 Sql Server 2008 SP1。 我正在尝试将使用命令 aspnet_reg
在创建一个新的 MVC 项目时,如果它是一个非空项目,Visual Studio 会处理 SqlMembershipProvider。 Visual Studio 创建一个数据库和所有必要的表。 但是
我正在创建一个自定义 SqlMembershipProvider 类,以向基类添加一些增强功能。不过,我正在忙于处理连接字符串。如何从配置中读取连接字符串名称并使其可供其余方法使用? 现在我有: pu
我将 SqlMembershipProvider 与 asp.net 一起使用,在我尝试使用 iframe 或框架之前它工作正常。 当我在没有它们的情况下登录时,我没有任何问题,但如果我从我们客户的站
我一直在寻找有关如何将现有成员(member)数据库与新的 mvc 应用程序一起使用的指导。我发现的所有内容都与创建新的成员(member)数据库有关。 我希望简单地将新应用程序指向某个地方的现有数据
我是一名优秀的程序员,十分优秀!