У меня есть приложение MVC4, в котором я назначил роли моему пользователю с помощью настраиваемого поставщика роли, поэтому, когда я проверяю User.IsInRole на мою таблицу User, он определяет, какие ссылки и т. Д. Отображаться на экране на моей странице _Layout.cshtml. Это работает на странице «Макет», в которой появляются правильные ссылки.Атрибут авторизации, не работающий с приложением Windows Authentication
Однако, когда я защитить мой контроллер администратора с помощью
[Authorize(Roles = "Admin")]
Я получаю следующую трассировку стека от объекта не установлен в случае ошибки объекта:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +39
System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +159
System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +96
System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302
System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +382
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71
System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
Что именно находится в этот контекст фильтра? Это работает без каких-либо дополнительных настроек при использовании ADFS или проверки подлинности форм на основе, но при использовании Windows, проверка подлинности на основе я должен был сделать следующее, чтобы получить IsInRole метод работы:
this.UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
if (this.UserName.Contains("\\"))
{
string[] stringArray = this.UserName.Split(new Char[] { '\\' });
this.UserName = stringArray[1];
MyUser identity = userRepository.Get(u => u.Username == this.UserName).FirstOrDefault();
HttpContext.Current.User = identity;
}
Мне нужно настроить некоторые другие Do HttpContext надлежащее в чтобы атрибут Authorize работал так же, как метод IsInRole?
Кто-нибудь может мне помочь с этим? 50 очков теперь доступно спасибо – Jay
Можете ли вы установить точку останова только до того, как получите это. Имя пользователя? Я предполагаю, что GetCurrent() возвращает null. FilterContext предоставит вам все, что вам нужно, чтобы написать свой фильтр, который будет включать в себя httpcontext и словарь маршрута. Посмотрите http://msdn.microsoft.com/en-us/library/dd381609(v=vs.100).aspx для разных контекстов фильтров. –
GetCurrent возвращает имя пользователя, и я правильно могу получить имя пользователя, однако из этого контекста авторизации и текущего пользовательского контекста не устанавливается так, как это сделано в ADFS и Forms, все, что требовалось, это получить имя пользователя, которое я могу сделать здесь, я догадываюсь, что мне не хватает шага – Jay