2

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

我们正在构建一个 Sharepoint 2010 - 应用程序,它由一些 Sharepoint Web 部件和许多 ASP.Net 站点组成。因此,我们仅限于使用没有 MVC 的 ASP.Net。这个决定是做出的,不能拒绝。

我们正在使用带有模拟的 Windows 身份验证。用户存储在应用程序数据库中。除了用户之外,还有对特定对象和特定操作具有权限的角色。所有这些信息都存储在自定义数据库中。

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

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

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

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

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

4

2 回答 2

0

我们一直在共享点作为应用程序主机。

我已经实现了一个自定义用户控件,它实现了所有的安全问题。

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);
    }
}

自定义角色提供者

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 中注册。但是时间很短;)

于 2012-12-13T08:37:54.717 回答
0

欢迎来到堆栈溢出!对此的一些想法-

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

  2. 这取决于您的网络场架构。如果您的 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 中。

于 2012-10-03T18:17:06.920 回答