2009-05-21 135 views

回答

2

Shibboleth的发布与 会话到HTTP请求头中,基于在属性接受政策(1.3.x中)中所定义 标题名称相关联的用户属性或属性映射(2.X) 文件。根据CGI规范定义的映射规则,这些标题被转换为基于 的CGI变量。

你应该意识到这个安全公告的: http://shibboleth.net/community/advisories/secadv_20090615.txt

+0

请提供更新后的链接,我有同样的问题,链接无效。请尽快获得帮助。谢谢 – Ruba 2013-04-05 14:36:11

0

我从来没有用户shibboleth,但你可以从Controller.User属性中获取有关用户的信息。它将返回当前线程的通用主体。使用此主体可以检查用户是否已通过身份验证并获取用户的登录名。这是由于登录后设置了身份验证Cookie并且此Cookie包含有限数量的信息的原因。并且在登录后每个请求上只检查这个cookie(如果它存在并且有效 - 用户被认证)。
所以如果你需要一些特定的信息,你可以手动加载一个用户(最好在这里使用缓存)并检查你想要的任何东西。
你也可以在请求开始的时候创建并附加你自己的主体,并将必要的信息附加到线程上(例如,在请求开始时从基本主体使用用户名从db/cache加载用户,创建并设置自己的主体给线)。在此之后,您可以检查您需要的用户的所有属性。

0

哪里会附上自己的本金?您在请求开始时说,但如果您不希望每个请求授权,该怎么办?

0

你要创建的Global.asax.cs的方法具有以下签名

protected void Application_PostAuthenticateRequest() 
{ 
    //Your code here. 
} 

这将被自动调用之前,几乎什么都做(MVC将调用此方法,如果它存在,你不必在任何地方“打开”),这是你需要设置校长的地方。例如,假设您有一个名为RolesHeader的标题,其中包含角色的逗号分隔值,另一个标头为UserId,其中包含用户标识。

你的代码,没有任何错误处理,可能看起来像:

protected void Application_PostAuthenticateRequest() 
{ 
    var rolesheader = Context.Request.Headers["RolesHeader"]; 
    var userId = Context.Request.Headers["UserId"]; 
    var roles = rolesheader.Split(','); 
    var principal = new GenericPrincipal(new GenericIdentity(userId), roles); 
    Context.User = principal; 
} 

这是校长/身份的[Authorize]属性使用,所以这里将其设置在请求生命周期的开始意味着[Authorize]属性将正常工作。

这样做的其余部分是可选的,但我建议:

我喜欢创造实现的IPrincipal和IIdentity的,而不是使用的GenericPrincipal和GenericIdentity我自己的自定义类,所以我的东西更多的用户信息在里面。然后,我的自定义Principal和Identity对象具有更丰富的信息,例如分支号码或电子邮件地址等。

然后,我创建了一个名为BaseController控制器具有以下

protected new CustomPrincipal User 
{ 
    get 
    { 
     return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal(); 
    } 
} 

这让我访问我所有的丰富的自定义主要的数据,而不只是什么在IPrincipal的定义。我所有的真实控制器都继承自BaseController,而不是直接从Controller继承。

很显然,当使用这样的自定义委托人时,在Application_PostAuthenticateRequest()方法中,您将Context.User设置为您的CustomPrincipal而不是GenericPrincipal