在ApiController操作中获取当前用户,而不传递用户ID作为参数
我们如何在安全的ApiController操作中获取当前用户,而不传递userName或userId作为参数?
我们认为这是可用的,因为我们在一个安全的行动。 处于安全行动意味着用户已经通过身份validation,并且请求具有她的不记名令牌。 鉴于WebApi已授权用户,可能有内置的方式来访问userId,而不必将其作为操作parameter passing。
在WebApi 2中,你可以在ApiController的一个方法中使用RequestContext.Principal
您也可以使用ApiController
上的User
属性来访问主体。
所以下面的两个陈述基本上是一样的:
string id; id = User.Identity.GetUserId(); id = RequestContext.Principal.Identity.GetUserId();
提示在于Webapi2自动生成的帐户控制器
将getter的属性定义为
public string UserIdentity { get { var user = UserManager.FindByName(User.Identity.Name); return user;//user.Email } }
并且为了得到UserManager – 在WebApi2中像Romans(读为AccountController)那样做
public ApplicationUserManager UserManager { get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); } }
这应该在IIS和自我主机模式下兼容
Karan Bhandari的回答很好,但是在一个项目中添加的AccountController很可能是一个Mvc.Controller
。 要将其答案转换为在ApiController中使用,请将HttpContext.Current.GetOwinContext()
更改为Request.GetOwinContext()
,并确保已添加以下2条using
语句:
using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin;
在.Net核心使用User.Identity.Name
获取用户的名称声明。
如果您使用Asp.Identity UseManager,它会自动设置值
RequestContext.Principal.Identity.GetUserId()
基于您在创buildIdentityDbContext中使用的IdentityUser 。
如果您正在实施自定义用户表和owin令牌承载身份validation,请检查我的答案。
如何在Web Api调用期间获取用户上下文?
希望它仍然有帮助。 🙂
上面的build议没有为我工作。 下面做了!
HttpContext.Current.Request.LogonUserIdentity.Name
我想有很多不同的场景,这个为我工作。 我的场景涉及一个AngularJS前端和一个Web API 2后端应用程序,都在IIS下运行。 我必须将这两个应用程序都设置为在Windows身份validation下运行。
无需传递任何用户信息。 浏览器和IIS交换login的用户凭据,并且Web API可以根据需要访问用户凭据(从IIS我推测)。
string userName; string userId; if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.Name != null) { userName = HttpContext.Current.User.Identity.Name; userId = HttpContext.Current.User.Identity.GetUserId(); }
或者基于Darrel Miller的评论,也许可以先用它来检索HttpContext。
// get httpContext object httpContext; actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);
也可以看看:
如何从Web API操作中访问HTTPContext
如果使用Windows Active Directory,则可以添加
using System.DirectoryServices.AccountManagement
并在api方法中,得到这样的全名:
var fullName = UserPrincipal.Current.DisplayName;
- 在GridView RowCommand中获取DataKey值
- entity framework – 在事务中的“SaveChanges”之前检索ID
- 超时过期。 操作完成之前超时的时间或服务器没有响应。 声明已经终止
- ValidateRequest =“false”在Asp.Net 4中不起作用
- ASP.NET Excel导出编码问题
- VS 2008不断删除并重新添加<SubType> ASPXCodeBehind </ SubType>
- asp.netvalidation,以确保文本框具有整数值
- 如何validationfile upload的文件types?
- RegisterStartupScript和RegisterClientScriptBlock之间的区别?