pup*_*eno 72 membership asp.net
我有一些表具有与aspnet_Users.UserID相关的uniqueidentifier UserID.当用户为这些表提交一些数据时,由于控制器方法有[授权],我得到一个用户对象.我可以使用User.Identity.Name获取用户名,但是如何让UserID能够建立(所有权)关系?
pup*_*eno 86
看来你无法从User对象中获取它,但你可以这样得到它:
Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
Run Code Online (Sandbox Code Playgroud)
小智 30
这是解决方案:
包括:
using Microsoft.AspNet.Identity;
Run Code Online (Sandbox Code Playgroud)
然后使用扩展方法:
User.Identity.GetUserId();
Run Code Online (Sandbox Code Playgroud)
Pur*_*ome 27
首先,这个答案不是严格意义上的MVC答案,而是ASP.NET的答案.在这种情况下,您的站点是MVC的事实与解决问题无关.
嗯.我不太确定你是如何在你的系统中处理你的用户的,但听起来你使用的asp.net membership provider是带有.net的开箱即用的(非常邪恶的).你说的这个事实暗示了这一点
使用默认的Forms身份验证系统,它使用默认的FormsIdentity,它只有一个名为Name的属性(正如您正确指出的那样).这意味着它只有一个值可以放置一些唯一的用户信息.在您的情况下,您将Name/UserName/DisplayName放在Name属性中.我假设这个名字是他们的显示名称,它是唯一的.无论你在这里投入什么价值,它都是独一无二的.
从这里,您可以获取用户的指导.
看一下这个.
using System.Web.Security;
....
// NOTE: This is a static method .. which makes things easier to use.
MembershipUser user = Membership.GetUser(User.Identity.Name);
if (user == null)
{
throw new InvalidOperationException("User [" +
User.Identity.Name + " ] not found.");
}
// Do whatever u want with the unique identifier.
Guid guid = (Guid)user.ProviderUserKey;
Run Code Online (Sandbox Code Playgroud)
因此,每次您希望获取用户信息时,都需要使用上面的静态方法从数据库中获取它.
阅读有关MSDN上的Membership类和MembershipUser类的所有信息.
因此,我会CACHE结果,所以你不需要继续击中数据库.
... cont from above....
Guid guid = (Guid)user.ProviderUserKey;
Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.
Run Code Online (Sandbox Code Playgroud)
否则,您可以创建自己的Identity类(继承自IIdentity)并添加您自己的自定义属性,例如UserID.然后,无论何时进行身份验证(以及每次请求),您都可以设置此值.无论如何,这是一个硬核解决方案,所以现在就去缓存.
HTH
Sim*_*ver 18
User.Identity是IPrincipal- 通常是类型System.Web.Security.FormsIdentity
它对UserIDs一无所知 - 它只是对"身份"概念的抽象.
该IIdentity的接口只有"名称"为用户,甚至没有"用户名".
如果你使用默认的MVC4,SimpleMembershipProvider你可以这样做:
WebSecurity.GetUserId(User.Identity.Name) // User is on ControllerBase
Run Code Online (Sandbox Code Playgroud)
(WebMatrix WebSecurity中的nuget包Microsoft.AspNet.WebPages.WebData中的位置
你也可以使用
WebSecurity.CurrentUserName
WebSecurity.CurrentUserId
Run Code Online (Sandbox Code Playgroud)
(如果您使用的是ASPNetMembershipProvider,这是较旧的更复杂的ASPNET会员系统,请参阅@ eduncan911的答案)
edu*_*911 11
如果您使用的是ASP.NET Membership(后者又使用IPrincipal对象):
using System.Web.Security;
{
MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
}
Run Code Online (Sandbox Code Playgroud)
User.Identity始终返回当前用户的状态,登录与否.
匿名与否等等.因此登录检查:
if (User.Identity.IsAuthenticated)
{
...
}
Run Code Online (Sandbox Code Playgroud)
所以,把它们放在一起:
using System.Web.Security;
{
if (User.Identity.IsAuthenticated)
{
MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
获取用户ID的最佳选择
添加以下参考
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;*
public myFunc()
{
.....
// Code which will give you user ID is
var tmp = User.Identity.GetUserId();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82952 次 |
| 最近记录: |