这是我的第一个请求,所以不要太难。 :)
我们正在构建一个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站点中的一些内容。
有人可以给我一个提示吗?有没有办法定制标准框架的某些部分来实现它?
我想要在会话中存储的用户及其角色和权限。这是一个好方法吗?该应用程序只能在本地网络中访问。
答案 0 :(得分:0)
欢迎使用stackoverflow!关于这一点的一些想法 -
您可能更适合在堂兄网站http://sharepoint.stackexchange.com提出这些问题。
这取决于您的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
另一种方法是,不要将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中注册。但时间很短;)