2016-07-19 6 views
4

In einem normalen Controller der folgende Code funktioniert arbeiten:User.Identity.GetUserId() -Methode nicht in einem Web-Api 2 Controller

[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)); 
} 

In einem Web-Api 2 Controller den Namen und die ID-Strings sind leer:

[HttpPost] 
public IHttpActionResult Test() 
{ 
    string name = User.Identity.GetUserName(); 
    string id = User.Identity.GetUserId(); 
    return Ok(); 
} 

Kann mir jemand sagen, warum GetUserId() Arbeiten in einem normalen Controller aber nicht in einer Api? In beiden Fällen bin ich angemeldet und GlobalConfiguration.Configure(WebApiConfig.Register); wird in Application_Start() in Global.asax.cs hinzugefügt.

Und ich habe ein anderes Problem. Wenn ich meine API-Controller mit [Authorize] Attribut dekorieren, kann ich nicht einmal auf meine API zugreifen. Der Postbote wird mich auf die Login-Seite lenken, wenn ein i bereits angemeldet bin.

[[Authorize]] 
public class TestController : ApiController 
{ 
    .... 
+0

Welche Authentifizierung verwenden Sie für Ihre Web API? – Nkosi

+0

Der Grund, warum der MVC funktioniert, ist, dass Sie wahrscheinlich Authentifizierung verwenden (wie ein Cookie) – Nkosi

+0

Sorry, ich bekomme das nicht, beide Controller der MVC und API sind Teil der gleichen Anwendung, auf Controller-Ordner. Verwenden der individuellen Benutzerkontenauthentifizierung –

Antwort

0
string id = RequestContext.Principal.Identity.GetUserId(); 

Versuchen Sie, diese zu verwenden, wenn Sie einen ApiController haben.

+0

Sorry funktioniert nicht, Name ist leer, ID ist Null. –

1

NKosi war korrekt. Dieses Problem brachte mich für eine Weile zum Stolpern, bis ich seinen Kommentar las.

Wenn Ihre Situation genau wie in meinem Fall ist, müssen Sie das Bearer-Token für alle authentifizierten Anforderungen an den WebAPI-Controller festlegen. Die MVC-Controller verwenden eine Cookie-Authentifizierung, die bereits separat eingerichtet wurde und funktioniert. Aber für die WebAPI-Controller müssen wir anscheinend etwas mehr Beinarbeit leisten.

In meinem WebAPI-Standardprojekt "Individuelle Benutzerkonten" sehe ich, dass eine Sitzungsspeichervariable, "accessToken", bereits standardmäßig festgelegt ist. Alles, was ich tun musste, war, es aus dieser Sitzungsspeichervariablen auszulesen und sicherzustellen, dass bei jeder Anfrage meines Clients an den WebAPI-Controller der Header "Authorization" auf "Bearer [your authentication token]" gesetzt war.

Von, http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api, so sollte die 'Get'-Anfrage an den WebAPI-Controller aussehen. Bitte beachten Sie die Eigenschaft "Autorisierung:".

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

diesen

string userId = HttpContext.Current.User.Identity.GetUserId(); 
1

Im Folgenden Code Versuche zu helfen, dieses Problem zu lösen.

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); 
       } 
      } 

Im Controller.

public IHttpActionResult Get() 
     { 
      var identity = (ClaimsIdentity)User.Identity; 
      return Ok(User.Identity.GetUserId()); 
     } 
Verwandte Themen