在没有MVC的情况下对数据库构建ASP.Net自定义授权

时间:2012-09-14 10:12:08

标签: asp.net security sharepoint authorization

这是我的第一个请求,所以不要太难。 :)

我们正在构建一个Sharepoint 2010 - 应用程序,它包含一些Sharepoint Web部件和许多ASP.Net-Sites。因此我们仅限于在没有MVC的情况下使用ASP.Net。做出这个决定,不能拒绝。

我们正在使用Windows Authentification with Impersonation。用户存储在应用程序数据库中。与用户一起,角色具有特定对象和特定操作的权限。所有这些信息都存储在自定义数据库中。

数据库有一个数据访问层(EF 4.0)。由于Sharepoint仅限于.NET Framework 3.5,因此业务逻辑由WCF数据服务组成,该服务使用DAL和业务逻辑库,该库访问WCF数据服务以获取所需信息。

ASP.Net-Pages和Sharepoint Web部件直接访问业务逻辑。

我现在需要的是某种Manager-Class,它根据数据库检查用户以授权他访问特定对象。我不想以编程方式去做。我想使用注释来指定是否可以调用业务层中的方法。此外,我想在没有程序化if子句的情况下隐藏ASP.Net站点中的一些内容。

有人可以给我一个提示吗?有没有办法定制标准框架的某些部分来实现它?

我想要在会话中存储的用户及其角色和权限。这是一个好方法吗?该应用程序只能在本地网络中访问。

2 个答案:

答案 0 :(得分:0)

欢迎使用stackoverflow!关于这一点的一些想法 -

  1. 您可能更适合在堂兄网站http://sharepoint.stackexchange.com提出这些问题。

  2. 这取决于您的Web场体系结构。如果您的Web前端和数据源位于同一服务器上,那么使用Windows身份验证来确定当前用户应该很简单。但是,如果您的Web前端和数据源位于不同的服务器上,那么由于“双跃点”方案已经达到了限制,用户的凭据无法共享到sharepoint服务器后面的服务器 - 可以这么说。
    要解决此问题,请在SharePoint环境中使用Kerberos身份验证进行调查,以便SharePoint在整个服务器场中跟踪用户凭据 - http://blogs.technet.com/b/tothesharepoint/archive/2010/07/22/whitepaper-configuring-kerberos-authentication-for-sharepoint-2010-and-sql-server-2008-r2-products.aspx

  3. 另一种方法是,不要将SharePoint用作应用程序主机。创建您的Web应用程序并将其部署为自己的网站(http://mysupercoolsite.organization.com),并在SharePoint中创建一个新的“Web部件页面”,其中包含“整页垂直”布局。然后,在页面中添加“页面查看器”Web部件,将URL提供给mysupercoolsite.organization.com。这样,SharePoint就是用户的此应用程序的“门户”,但所有身份验证,授权和结构都基于应用程序本身,而不是基于SharePoint。

答案 1 :(得分:0)

我们作为应用程序主持人留在sharepoint。

我已经实现了一个自定义UserControl,它实现了所有安全问题。

public partial class FMD_RoleEnabledControl : System.Web.UI.UserControl
{
    public string EnabledRoles { get; set; }
    public bool HasDataBinding { get; set; }


    public string CurrentUserName
    {
        get { return Page.User.Identity.Name; }
    }

    protected override void OnPreRender(EventArgs e)
    {
        if (!HasDataBinding)
            Visible = EnabledRoles.Split(',').Any(rolle => new FMDRoleProvider().IsUserInRole(CurrentUserName, rolle));
        base.OnPreRender(e);
    }

    protected override void OnLoad(EventArgs e)
    {
        if(HasDataBinding)
            Visible = EnabledRoles.Split(',').Any(rolle => new FMDRoleProvider().IsUserInRole(CurrentUserName, rolle));
        base.OnLoad(e);
    }
}

定制RoleProvider

public class FMDRoleProvider : RoleProvider
{
    public const string SEPERATOR = ",";

    ...

    public override string[] GetRolesForUser(string username)
    {
        if (username == null || username == "")
            throw new ProviderException("Kein User-Name übergeben"); //TODO

        string tmpRollen = "";

        RechteManager rm = new RechteManager();
        var rollen = rm.GetUserRollen(username);
        foreach (var rolle in rollen)
        {
            tmpRollen += rolle.ROL_Name + SEPERATOR;
        }

        if (tmpRollen.Length > 0)
        {
            //Letzten seperator entfernen
            tmpRollen = tmpRollen.Substring(0, tmpRollen.Length - 1);
            return tmpRollen.Split(',');
        }

        return new string[0];
    }

    ...

    public override bool IsUserInRole(string userName, string roleName)
    {
        if (userName == null || userName == "")
            throw new ProviderException("User name cannot be empty or null."); //TODO
        if (roleName == null || roleName == "")
            throw new ProviderException("Role name cannot be empty or null."); //TODO

        RechteManager rm = new RechteManager();
        return rm.IsUserInRolle(userName, roleName);
    }
}

用法

public partial class CustomControl: FMD_RoleEnabledControl

<custom:CustomControl ID="custom" runat="server" EnabledRoles="Admin" HasDataBinding="True" />

它只是第一种检查角色的方法,但效果很好。作为第二个目标,我将实施额外的安全性内容,例如检查特定操作。此外,RoleProvider必须在web.config中注册。但时间很短;)