2014-10-03 67 views
0

我正在开发一个MVC应用程序,我需要做一些业务逻辑每次请求时,除非请求是一个子请求,IE @Html.Action("GetStuff", "Stuff")。我用自定义用户对象设置HttpContextUser。检查请求是否在相同的请求mvc

if (SkipAuthorization(filterContext)) 
{ 
    return; 
} 
else 
{ 
    filterContext.HttpContext.User = GetBusinessUser() 
} 

凡SkipAuthorization看起来是这样的:

bool SkipAuthorization(AuthorizationContext filterContext) 
{ 
    //blah blah 
    bool isInSameRequest = (filterContext.HttpContext.User != null 
         && filterContext.HttpContext.User.Identity != null 
         && filterContext.HttpContext.User.Identity.IsAuthenticated); 
    //more blah blah 
    return result; 
} 

这似乎当服务器使用winAuth设置造成的错误,那么我想我们都学到的东西吧?

我的问题如下,有没有更好的方法来检查请求是否是一个子请求,并跳过它或我必须检查用户是否类型WindowsIdentityMyCustomUser?这让我想起了一个红旗,指出我不知道的其他用户类型,以及我们的业务类型可能会发生变化。

回答

0

我会用稍微不同的方法。每一个动作是一个孩子的动作(“子请求”正如你所说的话)将与

[ChildActionOnly] 

这样可以防止用户直接调用这些操作进行注释。

在视图内渲染子动作不会触发更多的请求,所以你应该没有任何额外的逻辑就可以。

+0

我对此并不确定,因为其他开发者需要知道添加这个,我希望能够在SkipAuthorization代码块中解决它。 – dbarnes 2014-10-03 19:48:33

+0

这是一个asp.net mvc的标准做法,所以其他开发人员应该知道它。但是如果你需要一个解决方法,一个好的解决方案是检查ViewData是否包含某个键,例如:ViewData [“firstrequest”]。如果密钥不存在并将其设置,则可以执行授权逻辑,并且之后运行的所有其他操作都将看到密钥并跳过授权逻辑。 – DrinkBird 2014-10-03 20:23:14

相关问题