我有一个MVC5网站,我希望任何人都可以在受限制的管理区域之外查看该网站。我创建了一个过滤器来检查我已应用于管理控制器的用户AD组,这非常正常。
问题是观看主站点的人,如果它闲置一段时间,他们在导航到页面时会收到未经授权的响应。一旦他们刷新了它的罚款并允许他们回到页面。
Web.Config在
中有以下内容<authentication mode="Windows" />
如果我将其删除,则问题就会消失,但管理员控制器无法正常工作,因为我的自定义过滤器中找不到Windows用户。
自定义过滤器只检查AD组:
var groupList = GetGroupList();
if (base.AuthorizeCore(httpContext))
{
if (string.IsNullOrEmpty(groupList))
return true;
var groups = groupList.Split(',').ToList();
var context = new PrincipalContext(ContextType.Domain, "MYDOMAIN");
var userPrincipal = UserPrincipal.FindByIdentity(
context,
IdentityType.SamAccountName,
httpContext.User.Identity.Name);
if (userPrincipal == null)
return false;
try
{
foreach (var group in groups)
if (userPrincipal.IsMemberOf(context,
IdentityType.Name,
group))
return true;
}
catch
{
return false;
}
答案 0 :(得分:0)
我认为您希望在未经授权的访问时将用户重定向到某个错误页面。 您可以通过在Web配置中添加此项来完成此操作。 (AccessDenied.aspx页面是您为Un Authorized user access编写消息的地方)
<customErrors defaultRedirect="ErrorPage.aspx" mode="On">
<error statusCode="401" redirect="AccessDenied.aspx" />
</customErrors>
或者您可以在Global.asax文件中执行此操作
protected void Application_AuthenticateRequest(Object sender,
EventArgs e)
{
if (!Request.IsAuthenticated) Response.Redirect(
"AccessDenied.aspx");
}
答案 1 :(得分:0)
在我最近的经验中,从IIS框中使用AD,我使用相同的过滤器来按AD组过滤。虽然我的过滤器是相同的,但我注意到httpContext.User.Identity.Name
不会像控制器中的“普通”匿名网站那样返回用户。
为了让它通过AD用户sans登录屏幕进行自动授权,我必须禁用匿名身份验证,启用Windows身份验证,设置<identity impersonate="true" />
并使用:
UserPrincipal adUser = null;
using (HostingEnvironment.Impersonate())
{
var userContext = System.Web.HttpContext.Current.User.Identity;
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
}
// and work with 'adUser' from here on in my controllers...
我的应用程序现在正在内部投入生产,但我没有遇到你的psuedo'超时'问题。你的web.config中是否有任何无关的表格auth标签?
我还必须在我的web.config中设置<sessionState mode="InProc" />
。