在常规控制器中,以下代码有效:
[HttpPost]
public ActionResult Custom()
{
string name = User.Identity.GetUserName();
string id = User.Identity.GetUserId();
return Content(string.Format("Name:{0} </br> ID: {1}",name, id));
}
在Web Api 2 Controller中,name和id字符串为空:
[HttpPost]
public IHttpActionResult Test()
{
string name = User.Identity.GetUserName();
string id = User.Identity.GetUserId();
return Ok();
}
任何人都可以告诉我为什么GetUserId()
在普通控制器中工作但不在
API?在这两种情况下,我都已登录,并在GlobalConfiguration.Configure(WebApiConfig.Register);
的{{1}}中添加了Application_Start()
。
我有另一个问题。如果我用Global.asax.cs
属性装饰我的api控制器,我甚至无法访问我的api。当我已登录时,邮递员会将我引导至登录页面。
[Authorize]
答案 0 :(得分:1)
NKosi是对的。这个问题让我感到难过,直到我读完他的评论。
如果您的情况与我的情况类似,那么您需要为WebAPI控制器的所有经过身份验证的请求设置承载令牌。 MVC控制器使用cookie身份验证,它已经单独设置并且可以工作。但是对于WebAPI控制器,显然我们需要做更多的工作。
在我的默认“个人用户帐户”WebAPI项目中,我发现默认情况下已设置了会话存储变量“accessToken”。我所要做的只是从该会话存储变量中读取它,并确保从我的客户端到WebAPI控制器的每个请求都将“授权”标头设置为“承载[您的身份验证令牌]”。
From,http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api,这就是对WebAPI控制器的'Get'请求应该是什么样子。请注意“授权:”属性。
GET https://localhost:44305/api/values/1 HTTP/1.1
Host: localhost:44305
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: */*
Authorization: Bearer imSXTs2OqSrGWzsFQhIXziFCO3rF...
X-Requested-With: XMLHttpRequest
答案 1 :(得分:1)
试试这个
string userId = HttpContext.Current.User.Identity.GetUserId();
答案 2 :(得分:1)
以下代码将有助于解决此问题。
using (josd_databaseEntities entities = new josd_databaseEntities())
{
josddevotee user = entities.josddevotees.Where
<josddevotee>(r => r.Devt_Email == context.UserName && r.Devt_Password == context.Password).FirstOrDefault();
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
else
{
string id = user.Devt_ID.ToString();
identity.AddClaim(new Claim(ClaimTypes.Role, "user"));
identity.AddClaim(new Claim("username", context.UserName));
**identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, id));**
context.Validated(identity);
}
}
在Controller中。
public IHttpActionResult Get()
{
var identity = (ClaimsIdentity)User.Identity;
return Ok(User.Identity.GetUserId());
}
答案 3 :(得分:0)
string id = RequestContext.Principal.Identity.GetUserId();
当你有ApiController时尝试使用它。