我在哪里可以获取有关当前连接的用户的信息?也就是说,shibboleth如何传递信息?关于shibboleth和授权的asp.net mvc身份验证
我可以使用基于从shibboleth获取的数据的[Authorize]属性对动作设置一些限制吗?
我在哪里可以获取有关当前连接的用户的信息?也就是说,shibboleth如何传递信息?关于shibboleth和授权的asp.net mvc身份验证
我可以使用基于从shibboleth获取的数据的[Authorize]属性对动作设置一些限制吗?
Shibboleth的发布与 会话到HTTP请求头中,基于在属性接受政策(1.3.x中)中所定义 标题名称相关联的用户属性或属性映射(2.X) 文件。根据CGI规范定义的映射规则,这些标题被转换为基于 的CGI变量。
你应该意识到这个安全公告的: http://shibboleth.net/community/advisories/secadv_20090615.txt
我从来没有用户shibboleth,但你可以从Controller.User属性中获取有关用户的信息。它将返回当前线程的通用主体。使用此主体可以检查用户是否已通过身份验证并获取用户的登录名。这是由于登录后设置了身份验证Cookie并且此Cookie包含有限数量的信息的原因。并且在登录后每个请求上只检查这个cookie(如果它存在并且有效 - 用户被认证)。
所以如果你需要一些特定的信息,你可以手动加载一个用户(最好在这里使用缓存)并检查你想要的任何东西。
你也可以在请求开始的时候创建并附加你自己的主体,并将必要的信息附加到线程上(例如,在请求开始时从基本主体使用用户名从db/cache加载用户,创建并设置自己的主体给线)。在此之后,您可以检查您需要的用户的所有属性。
哪里会附上自己的本金?您在请求开始时说,但如果您不希望每个请求授权,该怎么办?
你要创建的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
。
请提供更新后的链接,我有同样的问题,链接无效。请尽快获得帮助。谢谢 – Ruba 2013-04-05 14:36:11