2014-10-20 7 views
2

ResourceAuthorize 속성을 Thinktecture.IdentityModel에서 사용하려고 시도하지만 모든 컨텍스트가 없어서 모든 작업이 중지됩니다. 누락 된 컨텍스트

나는 권한 부여 관리자

[assembly: OwinStartup(typeof(My.WebApi.Startup))] 

namespace My.WebApi 
{ 
    public class Startup 
    {   
     public void Configuration(IAppBuilder app) 
     { 
      AuthConfig.Configure(app); 
     } 
    } 
} 

public class AuthConfig 
{ 
    public static void Configure(IAppBuilder app) 
    {   
     app.UseResourceAuthorization(new ResourceAuthorizationMiddlewareOptions 
     { 
      Manager = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IResourceAuthorizationManager)) as IResourceAuthorizationManager 
     }); 
    } 
} 

을 설정 owin 시작 클래스가 나는 그것을 감지하고 호출 것을 알고있다. 더 MS_OwinContext 또는 MS_OwinEnvironment이 없기 때문에, 내가 널 반환)을 강화하고 그것이 GetOwinContext (에 의한 있다고보고있다

public static Task<bool> CheckAccessAsync(this HttpRequestMessage request, IEnumerable<Claim> actions, IEnumerable<Claim> resources) 
    { 
     var authorizationContext = new ResourceAuthorizationContext(
      request.GetOwinContext().Authentication.User ?? Principal.Anonymous, 
      actions, 
      resources); 

     return request.CheckAccessAsync(authorizationContext); 
    } 

: IdentityModel에서 다음 코드를 타격 때 나중에, 나는 널 포인터 예외가 요청에 대한 속성.

무엇이 누락 되었습니까?

업데이트 : 내가 owin.environment 속성을 사용할 수있다, 그러나 그것은`HttpContextWrapper이 아닌 요청의 일부 것으로 나타났습니다

.

주변 검색, 나는 그것이 MS_OwinEnvironmentowin.environment 변환해야하지만, 분명히, 그 코드가 내 경우에는 호출되지 않습니다처럼 보이는 System.Web.Http.WebHost.HttpControllerHandler의 내부의 코드를 ... 발견

internal static readonly string OwinEnvironmentHttpContextKey = "owin.Environment"; 
internal static readonly string OwinEnvironmentKey = "MS_OwinEnvironment"; 

internal static HttpRequestMessage ConvertRequest(HttpContextBase httpContextBase, IHostBufferPolicySelector policySelector) 
{ 
    HttpRequestBase requestBase = httpContextBase.Request; 
    HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethodHelper.GetHttpMethod(requestBase.HttpMethod), requestBase.Url); 
    bool bufferInput = policySelector == null || policySelector.UseBufferedInputStream((object) httpContextBase); 
    httpRequestMessage.Content = HttpControllerHandler.GetStreamContent(requestBase, bufferInput); 
    foreach (string str in (NameObjectCollectionBase) requestBase.Headers) 
    { 
    string[] values = requestBase.Headers.GetValues(str); 
    HttpControllerHandler.AddHeaderToHttpRequestMessage(httpRequestMessage, str, values); 
    } 
    HttpRequestMessageExtensions.SetHttpContext(httpRequestMessage, httpContextBase); 
    HttpRequestContext httpRequestContext = (HttpRequestContext) new WebHostHttpRequestContext(httpContextBase, requestBase, httpRequestMessage); 
    System.Net.Http.HttpRequestMessageExtensions.SetRequestContext(httpRequestMessage, httpRequestContext); 
    IDictionary items = httpContextBase.Items; 
    if (items != null && items.Contains((object) HttpControllerHandler.OwinEnvironmentHttpContextKey)) 
    httpRequestMessage.Properties.Add(HttpControllerHandler.OwinEnvironmentKey, items[(object) HttpControllerHandler.OwinEnvironmentHttpContextKey]); 
    httpRequestMessage.Properties.Add(HttpPropertyKeys.RetrieveClientCertificateDelegateKey, (object) HttpControllerHandler._retrieveClientCertificate); 
    httpRequestMessage.Properties.Add(HttpPropertyKeys.IsLocalKey, (object) new Lazy<bool>((Func<bool>) (() => requestBase.IsLocal))); 
    httpRequestMessage.Properties.Add(HttpPropertyKeys.IncludeErrorDetailKey, (object) new Lazy<bool>((Func<bool>) (() => !httpContextBase.IsCustomErrorEnabled))); 
    return httpRequestMessage; 
} 

업데이트 2 :

mvc 컨트롤러 내부에서 컨텍스트를 사용할 수 있습니다. 하지만 webapi 컨트롤러가 아닙니다.

+0

응용 프로그램에서 하나의 엔트리 포인트 만 얻을 수 있도록 global.asax 파일을 안전하게 삭제할 수 있습니다. 이게 뭔가를 해결할 지 확신 할 수 없지만 확실히 깨끗하게 처리 할 수 ​​있습니다 .... –

+0

VS와 함께 제공되는 웹 응용 프로그램 템플릿은 global.asax와 시작 클래스를 만듭니다. 어떤 사람들은 이벤트를 후크하기 쉽도록 만들었으므로 '주변을 지켜라'고 말합니다. ... 제거하는 데 도움이 될지 모르겠지만 시도 할 것입니다. – Vegar

답변

3

팀원이 해결책을 찾았습니다. 그는 간단히 owin startup 클래스에 다음 줄을 추가했습니다.

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

왜이 문제가 또 다른 수수께끼일까요? 하지만 우리는 wsFederation을 사용하고 있으므로 몇 가지 방법이 필요합니다. 하지만 wsFed를 사용하지 않으면 어떻게 될까요? 문맥을 얻기 위해 여전히 필요한가? 누가 알겠습니까?

+0

하지만 언젠가는 내가 이해할 수만 있다면 정말 고맙겠습니다 ... –