Cia*_*uen 9 security authentication asp.net-mvc-4
我正在使用Visual Studio 2011测试版开发一个新的asp.net mvc4项目,并试图让我了解整个安全问题.它是一个内部Intranet应用程序,最初将使用单点登录,因此不会(还)提示用户输入Windows ID /密码.该公司有一个自定义应用程序,用于存储不同应用程序的角色,并可通过存储过程调用获得.它将获取用户的登录ID并返回某种包含角色的集合,例如"MyApp.Data","MyApp.User","MyApp.Admin".那么这就是所谓的 - 这是一个自定义成员资格提供者,自定义角色提供者或其他什么?
我一直在阅读授权,认证,会员资格,角色等所有细节,我现在看不到树木.我已经读过现有的ASP.NET安全对象已经过试用和测试,除非有非常复杂的要求,否则内置的对象就足够了,所以我很乐意使用现有的内容.
因此,如果用户已经登录到网络,这意味着他们已经过身份验证 - 正确吗?如果是这样,那么我只需要实现授权.是否有必要使用Authorize属性修饰每个Controller或Action?如果是这样,如果我从自定义角色存储应用程序中检索角色,那么[Authorize(Roles ="ABC")]的"ABC"部分如何设置?
我从Jon Galloway那里阅读了几篇文章和博客文章,包括这篇文章,但我最后迷路了:
这么多问题......如果有人知道如何将这一切挂在一起的良好高级描述那么我全都耳朵:)
好的,如果没有一个答案能够高度评价这一切是如何挂在一起的,那么我认为到目前为止我已经删除了我的发现:
该公司使用Active Directory存储用户登录详细信息,因此这用于成员身份我不需要自定义成员资格提供程序.用户登录公司网络后,即可对其进行身份验证.添加全局授权过滤器可确保需要对访问系统的任何用户进行身份验证.来自msdn的Rick Anderson的最新信息:
所以在Global.asax中我会添加:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute()); //new
}
Run Code Online (Sandbox Code Playgroud)
一旦用户通过身份验证,我就需要处理授权.该公司有一个现有的全局数据存储,用于我不具有更新访问权限的角色,只有读访问权限,因此我可以通过存储的proc调用检索给定用户的角色.在请求发出后,帮助台可能需要几天到几周的时间来创建角色,因此最初会创建2个标准角色,User和Admin以及后续角色将存储在我们的应用程序数据库中.
除了这两个标准角色之外,还需要后续角色,例如超级用户等.这些角色将根据业务规则等具有各种权限,并且需要存储在我们的应用程序数据库中.因此,对于这种情况,我需要创建一个自定义角色提供程序,将相应的asp.net角色表添加到我的app数据库,然后将其插入web.config.这是一个名为"使用角色管理授权"的ms页面,我选择了以下内容:
从我到目前为止所读到的,自定义角色提供程序所需的唯一表是Roles和UsersInRoles.
CREATE TABLE角色(Rolename文本(255)NOT NULL,ApplicationName文本(255)NOT NULL,CONSTRAINT PKRoles PRIMARY KEY(Rolename,ApplicationName))
CREATE TABLE UsersInRoles(用户名文本(255)NOT NULL,Rolename文本(255)NOT NULL,ApplicationName文本(255)NOT NULL,CONSTRAINT PKUsersInRoles PRIMARY KEY(用户名,Rolename,ApplicationName))
完成所有这些后,我需要弄清楚如何将全局数据存储中的2个标准角色(用户和管理员)与存储在我的应用数据库中的自定义角色合并,如果我可以使用(例如)[授权(角色=) "管理员,超级用户")]在Controller/Action上,或者如果我需要继承AuthoriseAttribute并做一些更聪明的事情.
我刚刚意识到,当我使用AD进行身份验证时,我需要一种添加/注入当前用户所属角色集合的方法.因此,虽然我不需要任何自定义成员资格提供程序功能,但仍需要与httpContext.User进行交互以更新其Roles集合.
如果您的身份验证已经由Windows处理(我通过Active Directory猜测),那么您正在寻找的是一种将角色与用户匹配的授权机制.您拥有的一个选项是成功将用户角色加载到当前会话中.然后创建一个自定义授权属性,该属性将检查当前会话是否具有您正在使用的必要角色
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited=true, AllowMultiple=true)]
public class CustomAuthorizationAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
}
//check your users against a database and return true or false
return base.AuthorizeCore(httpContext);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用这样的属性
[CustomAuthorization]
public ActionResult SomeAction()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
AuthorizeCore是用于检查是否应允许该用户访问相应的Action Method的方法.在此方法中,您可以针对数据库或存储角色的位置检查httpContext.User.Identity.Name属性.如果您通过Active Directory使用Windows身份验证,HttpContext.User.Identity应该是WindowsIdentity的一个实例
| 归档时间: |
|
| 查看次数: |
28248 次 |
| 最近记录: |