【发布时间】:2013-11-29 10:32:34
【问题描述】:
我有一个 MVC4 应用程序,我使用自定义角色提供程序为我的用户分配了角色,这样当我根据我的 User 表检查 User.IsInRole 时,它会确定在我的 _Layout.cshtml 页面的屏幕上显示哪些链接等。这在“布局”页面上有效,因为出现了正确的链接。
但是,当我使用
保护我的管理控制器时[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;
}
我是否需要适当配置一些其他 HttpContext 以使 Authorize 属性以与 IsInRole 方法相同的方式工作?
【问题讨论】:
-
谁能帮我解决这个问题? 50 点赏金现在可用,谢谢
-
你能在得到 this.UserName 之前设置一个断点吗?我猜 GetCurrent() 返回一个空值。 FilterContext 将为您提供编写过滤器所需的一切,其中包括 httpcontext 和路由字典。查看msdn.microsoft.com/en-us/library/dd381609(v=vs.100).aspx 了解不同的过滤器上下文。
-
GetCurrent 正在返回用户名,我能够正确获取用户名,但是从这里授权上下文和当前用户上下文没有像 ADFS 和 Forms 中那样设置,所有需要的是要获得我可以在这里做的用户名,我想我错过了一步
标签: asp.net-mvc-4 windows-authentication roleprovider action-filter