我在哪里可以获得有关当前连接用户的信息?也就是说,shibboleth如何传递信息?
我可以根据从shibboleth获取的数据使用[Authorize]属性对操作设置一些限制吗?
答案 0 :(得分:2)
Shibboleth发布与之关联的用户属性 基于定义的标头名称的HTTP请求标头的会话 在属性接受策略(1.3.x)或属性映射(2.x)中 文件。这些头部基于转换为CGI变量 关于CGI规范定义的映射规则。
您应该了解此安全建议: http://shibboleth.net/community/advisories/secadv_20090615.txt
答案 1 :(得分:0)
我从未使用过shibboleth,但您可以从Controller.User属性获取有关用户的信息。它将返回当前线程的通用主体。使用此主体,您可以检查用户是否已通过身份验证并获取用户的登录名。这是因为登录后设置了身份验证cookie并且此cookie包含有限数量的信息。并且在登录后的每个请求上仅检查此cookie(如果它存在且有效 - 用户已通过身份验证)
因此,如果您需要某些特定信息,您可以手动加载用户(最好在此处使用缓存)并检查您想要的任何内容。
您还可以在请求开始时创建并将自己的主体与必要信息附加到线程(例如,在请求开始时使用基本主体的用户名从db / cache加载用户,创建并设置自己的主体到线程) 。在此之后,您可以检查所需用户的所有属性。
答案 2 :(得分:0)
你会在哪里附上自己的校长?您在请求开始时说,但如果您不希望每个请求都授权,该怎么办?
答案 3 :(得分:0)
您需要在Global.asax.cs中创建一个具有以下签名
的方法protected void Application_PostAuthenticateRequest()
{
//Your code here.
}
在几乎所有其他操作完成之前,这将被自动调用(如果存在,MVC将调用此方法,您不必在任何地方“打开”),这是您需要设置Principal的地方。例如,假设您有一个名为RolesHeader
的标头,其中包含逗号分隔的角色值,另一个名为UserId
的标头具有(duh)用户标识。
您的代码没有任何错误处理,可能类似于:
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]
属性使用的是Principal / Identity,因此在请求生命周期的开头设置它意味着[Authorize]
属性将正常工作。
其余部分是可选的,但我建议:
我喜欢创建自己的自定义类来实现IPrincipal和IIdentity,而不是使用GenericPrincipal和GenericIdentity,因此我可以在其中填充更多用户信息。然后,我的自定义Principal和Identity对象具有更丰富的信息,例如分支号码或电子邮件地址等等。
然后,我创建一个名为BaseController
的控制器,它具有以下
protected new CustomPrincipal User
{
get
{
return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal();
}
}
这使我可以访问所有丰富的自定义Principal数据,而不仅仅是IPrincipal中定义的内容。然后我的所有真实控制器都从BaseController
继承,而不是直接从Controller
继承。
显然,在使用像这样的自定义Principal时,在Application_PostAuthenticateRequest()方法中,您将Context.User设置为CustomPrincipal
而不是GenericPrincipal
。