我最近开始使用 ASP.NET 表单例份验证和成员资格。
我在 Visual Studio 中创建了一个 C# 项目,它会自动创建类似“/Account/Login.aspx”的页面。
然后我按照安装示例 aspnet_*
表到我的 SQL Server 数据库,我已经能够使用 <asp:CreateUserWizardStep>
控制创建用户。
然后我就能够以该用户身份登录,并且在调用 <asp:LoginName>
时会出现登录的用户名
但是,当我在 C# 代码中调用以下代码时,在 Button Click 事件处理程序中,我总是会遇到空引用异常:
string UserID = Membership.GetUser().ProviderUserKey.ToString();
这不应该返回 UserID
吗?来 self 的 aspnet_users 表?
如果<asp:LoginName>
正在显示一个 UserName 值,我不应该总是能够调用 Membership.GetUser().ProviderUserKey
吗?
最佳答案
首先检查您是否拥有经过身份验证的有效用户 ID。从你的问题来看,你确实有。但进行一系列检查始终是一个好习惯。
我喜欢使用这两个方法(第二个调用第一个,但你也可以直接调用第一个。我建议调用第二个)执行各种检查并返回用户 ID,如果有则返回 null用户未通过身份验证或身份不明:
public static MembershipUser GetCurrentUser()
{
HttpContext httpContext = HttpContext.Current;
if (httpContext != null && httpContext.User != null && httpContext.User.Identity.IsAuthenticated)
{
return Membership.GetUser();
}
return null;
}
/// <summary>
/// Safe check of authenticity. Better than Request.IsAuthenticated in that if there's a used-to-be-valid cookie which does not correspond to the current database, it will fail safe
/// </summary>
/// <returns></returns>
public static bool IsUserAuthenticated()
{
if (HttpContext.Current == null)
return false;
var request = HttpContext.Current.Request;
if (!request.IsAuthenticated)
return false;
var membershipUser = GetCurrentUser();
if (membershipUser != null)
return true;
return false;
}
关于c# - Membership.GetUser().ProviderUserKey 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146830/