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_OwinEnvironment
에 owin.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 컨트롤러가 아닙니다.
응용 프로그램에서 하나의 엔트리 포인트 만 얻을 수 있도록 global.asax 파일을 안전하게 삭제할 수 있습니다. 이게 뭔가를 해결할 지 확신 할 수 없지만 확실히 깨끗하게 처리 할 수 있습니다 .... –
VS와 함께 제공되는 웹 응용 프로그램 템플릿은 global.asax와 시작 클래스를 만듭니다. 어떤 사람들은 이벤트를 후크하기 쉽도록 만들었으므로 '주변을 지켜라'고 말합니다. ... 제거하는 데 도움이 될지 모르겠지만 시도 할 것입니다. – Vegar