userID를 매개 변수로 전달하지 않고 ApiController 작업 내에서 현재 사용자를 가져옵니다.


97

userName 또는 userId를 매개 변수로 전달하지 않고 보안 ApiController 작업 내에서 현재 사용자를 가져 오는 방법은 무엇입니까?

우리는 보안 조치 내에 있기 때문에 이것이 가능하다고 가정합니다. 보안 작업에 있다는 것은 사용자가 이미 인증되었고 요청에 Bearer 토큰이 있음을 의미합니다. WebApi가 사용자에게 권한을 부여했기 때문에 사용자 ID를 작업 매개 변수로 전달하지 않고도 액세스 할 수있는 방법이 내장되어있을 수 있습니다.


이 답변을 참조하십시오 : stackoverflow.com/a/26453782/3290276 클레임 추가 트릭을했습니다
Gabriela Macias

답변:


149

WebApi 2에서는 ApiController RequestContext.Principal의 메서드 내에서 사용할 수 있습니다.


1
우리에게는 그 속성이없는 것 같습니다. 흠. 아마도 우리는 이전 버전의 WebApi를 사용하고있을 것입니다.
Shaun Luttin 2014

2
@ShaunLuttin 좋아, Web API 1을 사용하고 있다면 ApiController에 Prinicpal 속성이 있다고 생각합니다. 이것은 Request.Properties 컬렉션에 액세스하기위한 멋진 래퍼입니다. 주요 개체는 해당 사전에 저장됩니다.
Darrel Miller

6
잊지 마세요using Microsoft.AspNet.Identity;
오버로드

1
@DarrelMiller는 코드의 다른 부분 (컨트롤러 내부가 아님)에서 동일한 (요청 컨텍스트)을 가져 오는 방법이 있습니다.
Ajay Aradhya

2
@AjayAradhya 당신이 그것을 통과하는 경우에만. 웹 프레임 워크에 대한 이전의 노력은 정적 속성을 사용하여 요청 컨텍스트에 액세스하는 것이 모든 종류의 아키텍처 문제를 일으킨다는 것을 보여주었습니다. 처음에는 편리하지만 장기적으로 많은 통증을 유발합니다.
Darrel Miller

36

User속성을 사용하여 보안 주체에 액세스 할 수도 있습니다 ApiController.

따라서 다음 두 문장은 기본적으로 동일합니다.

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

15
여기에 작성한 것을 사용하려고하지만 GetUserId () 함수는 항상 null을 반환합니다. 사용자는 내가 베어러 토큰을 전달하고있어, auth'd되고 ApiController은 [권한 부여] 헤더가
여호수아 오하나을

GetUserId () 함수는 사용자에게 NameIdentifier 클레임이있는 경우에만 ID를 반환합니다. 이 문제를 해결하는 방법에 대한 예는 다음에서 Oswaldo의 답변을 참조하십시오. stackoverflow.com/questions/19505526
jramm

14

힌트는 Webapi2 자동 생성 계정 컨트롤러에 있습니다.

getter가 다음과 같이 정의 된이 속성을

public string UserIdentity
        {
            get
            {
                var user = UserManager.FindByName(User.Identity.Name);
                return user;//user.Email
            }
        }

UserManager를 얻으려면-WebApi2에서 -do as Romans (AccountController로 읽음)

public ApplicationUserManager UserManager
        {
            get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        }

IIS 및 자체 호스트 모드에서 호환되어야합니다.


7

위의 제안 중 어느 것도 나를 위해 일하지 않았습니다. 다음은 그랬습니다!

HttpContext.Current.Request.LogonUserIdentity.Name

다양한 시나리오가 있고 이것이 저에게 효과적이라고 생각합니다. 내 시나리오에는 AngularJS 프런트 엔드와 웹 API 2 백엔드 애플리케이션이 포함되었으며 둘 다 IIS에서 실행되었습니다. 응용 프로그램이 모두 Windows 인증 에서 독점적 으로 실행되도록 설정해야했습니다 .

사용자 정보를 전달할 필요가 없습니다. 브라우저와 IIS는 로그온 한 사용자 자격 증명을 교환하고 웹 API는 요청시 사용자 자격 증명에 액세스 할 수 있습니다 (IIS에서).


6

Karan Bhandari의 대답은 좋지만 프로젝트에 추가 된 AccountController는 Mvc.Controller. ApiController 변화에 사용하기 위해 그의 대답을 변환하려면 HttpContext.Current.GetOwinContext()Request.GetOwinContext()있는지 다음 2 추가 할 using문 :

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;


3

Asp.Identity UseManager를 사용하는 경우 자동으로 값을 설정합니다.

RequestContext.Principal.Identity.GetUserId ()

를 기반으로 IdentityUser 당신은 만드는 데 사용 IdentityDbContext을 .

사용자 정의 사용자 테이블 및 owin 토큰 전달자 인증을 구현하는 경우 친절하게 내 대답을 확인하십시오.

Web Api 호출 중에 사용자 컨텍스트를 얻는 방법은 무엇입니까?

여전히 도움이되기를 바랍니다. :)


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

또한보십시오:

웹 API 작업 내에서 HTTPContext에 액세스하는 방법


5
HttpContext는 호스팅 옵션을 제한하고 코드를 테스트하기 어렵게 만들므로 사용하지 마십시오.
Darrel Miller

당신은 자기가 호스트하는 경우 HttpContext 개체는 사전에되지 않습니다, 또는 OwinHttpListener 호스팅
대럴 밀러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.