2011-09-19 28 views
0

我需要阻止用户从多个会话登录到我的ASP.NET MVC应用程序,并找到this answer如何做到这一点。使用自定义属性保护某些MVC方法以防止多次登录?

现在我想添加一个MVC扭曲:控制器上的一些公共方法是不受保护的,我不在乎谁访问它们,有些受到[Authorize]属性的保护,以确保只有登录用户可以访问它们。现在我想定制AuthorizeAttribute,以便所有标记了该属性的方法都将执行相关问题中描述的无多重登录验证,并抛出某种LoggedInElsewhereException,以便客户端可以了解检查是否失败以及检查失败的原因。

我确定它可以完成,但怎么做?

+0

自动将它们从除最后一个之外的所有会话中注销会不会更容易? 您只需使所有其他会话无效,并且这些会话将只是未经身份验证。 显然,成员资格提供者必须改变以跟踪和做失效,如参考主题中所述。 – Artemiy

+0

@Artemiy - 我不知道你能做到这一点。怎么样? (请发表回复。) –

+0

嘿@Shaul你问了一个非常有趣的问题,但你的问题对我来说不是很清楚....但是它解决了。你试图说,一次用户可以访问你的授权区域。如果有人进入您的授权区域,则其他人将无法进入或访问该区域,直到先前的用户从该区域注销为止。如果我误解了,请纠正我理解你的要求。谢谢 – Thomas

回答

4

只需从AuthorizeAttribute派生您的新属性并重写OnAuthorization方法即可。在该方法中,先进行“单一会话”检查,然后再回到基础实施。

例如

public class CheckSessionAndAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override OnAuthorization(AuthorizationContext context) 
    { 
     //check session id in cache or database 
     bool isSessionOK = CheckSession(); 

     if (!isSessionOK) 
     { 
      //can be View, Redirect or absolutely customized logic 
      context.Result = new MyCustomResultThatExplainsError(); 
      return; 
     } 

     //do base stuff 
     base.OnAuthorization(context); 
    } 
} 
+0

谢谢@ivan,唯一的一点是抛出一个异常不会以任何可理解的方式告诉客户它们为什么被抛弃。能够返回有意义的错误对我来说很重要,例如将重定向返回到解释页面或类似的东西。这可以使用像这样的属性来完成吗? –

+0

@Shaul:当然有可能,查看更新回答 – ivan

+0

+1感谢您的帮助!我会稍后再测试...... :) –

相关问题