反对陈词滥调和授权asp.net的MVC认证
-
23-08-2019 - |
题
从哪里获取有关当前连接的用户信息?也就是说,如何陈词滥调传递信息?
我可以设置一些限制使用行动[授权]基于从陈词滥调获取的数据属性?
解决方案
的Shibboleth发布相关联的用户属性 会话到HTTP请求头,基于标题名称定义 在属性接受政策(1.3.x中)或属性映射(2.X) 文件。这些头被转化为基于CGI变量 上映射规则由CGI规范定义的。
您应该意识到这个安全公告的: http://shibboleth.net/community/advisories/secadv_20090615.txt
其他提示
我从来没有用户的陈词滥调,但你可以得到有关从Controller.User属性的用户信息。它将返回当前线程的一般原则。使用这个校长,您可以检查用户是否通过认证,并获得用户的登录名。这是由于在登录后的验证cookie设置的原因,这个cookie包含的信息量有限。并在登录后每个请求只有这个cookie被选中(如果存在且有效 - 用户进行身份验证)。结果 所以,如果你在某些特定的信息需要你可以手动加载用户(这是更好地在这里使用高速缓存),并检查任何你想要的。结果 你也可以创建和提供必要的信息附上自己的校长到线程上的请求开始(例如,在请求开始使用的用户名来自基地主要加载从DB /缓存用户,创建并设置自己的主线程) 。在此之后,你可以查看你所需要的用户的所有属性。
你会在哪里附上自己的本金?你说对请求的开始,但如果你不希望每次请求授权?
您将需要创建在Global.asax.cs中的方法具有以下特征
protected void Application_PostAuthenticateRequest()
{
//Your code here.
}
这将自动被调用之前,几乎什么都做(如果它存在MVC将调用此方法,你不必为“开启”的任何地方),而这正是你需要设置校长。例如,让我们假设你有一个头称为RolesHeader
具有角色的逗号分隔值,并且具有另一头称为UserId
(杜)的用户ID。
您的代码,没有任何错误处理,看起来可能是这样的:
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我自己的自定义类,这样我就可以在它的东西更多的用户信息。我的自定义主体和身份的对象,然后有更多丰富的信息,如分支号码或电子邮件地址或什么的。
然后,我创建一个名为BaseController
控制器具有以下
protected new CustomPrincipal User
{
get
{
return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal();
}
}
这让我访问我所有的丰富的自定义主要的数据,而不只是什么在IPrincipal的定义。我所有的真正的控制器然后从BaseController
,而不是直接从Controller
继承。
显然,在Application_PostAuthenticateRequest()方法中使用自定义主像这样的时候,你会设置Context.User是你CustomPrincipal
而不是GenericPrincipal
的。