User.Identity.GetUserId()方法无法在Web Api 2 Controller中使用

时间:2016-07-19 14:25:51

标签: asp.net asp.net-mvc asp.net-web-api

在常规控制器中,以下代码有效:

[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]

4 个答案:

答案 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时尝试使用它。