如何在不使用Membership.GetUser()的情况下访问ASP.NET Membership中的UserId?

时间:2020-03-06 14:51:14  来源:igfitidea点击:

如何在不使用ASP.NET Web应用程序项目中的" Membership.GetUser(用户名)"的情况下以ASP.NET成员身份访问" UserId"?

可以在UserName(System.Web.Profile.ProfileBase)旁边的Profile命名空间中包含UserId吗?

解决方案

是我们每次需要UserId时保存数据库调用的原因吗?如果是这样,当我使用ASP.NET MembershipProvider时,通常我会做一个允许我缓存该调用的自定义提供程序,或者是一个我可以缓存的实用程序方法。

如果我们正在考虑将其放入配置文件中,我认为这样做的理由不多,尤其是因为它仍然仍然需要数据库调用,并且除非我们在此处使用自定义配置文件提供程序,否则它会处理解析出UserId。

如果我们想知道为什么他们没有实现GetUserId方法,那是因为我们并不能始终保证用户ID像包含的提供程序中那样是GUID。

编辑:

请参阅ScottGu在提供程序上的文章,该文章提供了一个链接,可为SqlMembershipProvider下载实际的源代码。

但实际上最简单的方法是在用户对象或者实用程序类中使用GetUserId()方法,在该方法中,我们从缓存/会话中获取UserId(如果存在),否则访问数据库,按用户名缓存(或者存储在会话中),并退回。

需要考虑的其他事项(但由于Cookie的大小限制,请格外小心):表单身份验证:成员身份,角色和配置文件,不包含提供程序,也不包含会话

我们在这里有两个选择:

1)使用用户名作为用户数据表的主键
IE:

select * from [dbo.User] where Username = 'andrew.myhre'

2)将UserID添加到配置文件。

每种方法各有利弊。就我个人而言,我更喜欢第一个,因为这意味着我不一定需要设置现成的概要文件提供程序,而且无论如何我都希望在系统中强制使用唯一的用户名。

安德鲁:我会像默认显示的那样进行查询,因为没有索引与之匹配,所以我们有进行全表扫描的风险。此外,如果我们将用户数据库用于多个应用程序,则没有包括该应用程序ID。

最接近的索引是aspnet_Users_Index,它需要ApplicationId和LoweredUserName。

编辑:

糟糕,重新阅读了安德鲁的帖子,他没有对aspnet_Users表进行选择*,而是使用用户名作为主键的自定义配置文件/用户表。

我们是否尝试过使用" System.Web.HttpContext.Current.User.Identity.Name"? (请确保首先验证"用户"和"身份"是否为非空。)

我决定自行编写对用户的身份验证(非常简单,但确实可行),我应该很久以前就这样做。

我最初的问题是关于UserId的,但无法从以下位置获得:

System.Web.HttpContext.Current.User.Identity.Name

{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}

如果当前用户已成功登录,它将从aspnet_Membership表中为当前用户提供用户ID(唯一标识符)。如果我们尝试<%=%>或者在成功身份验证之前分配该值,则会收到错误消息"对象引用不正确"。设置为对象的实例"。

http://www.tek-tips.com/viewthread.cfm?qid=1169200&page=1

试试这个:

MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);