代码非常简单---问题是groupPath字符串中有一个无效字符(确切地说是'/').
我想要做的事情(至少作为一个停止差距)是跳过DirectoryEntries我无法获得cn - 无论为什么.
但是,当我运行此代码时,catch块不会运行,而是我得到:服务器无法运行.和未处理的System.Runtime.InteropServices.COMException.
为什么catch阻止不会捕获此异常.
try
{
using (DirectoryEntry groupBinding = new DirectoryEntry("LDAP://" + groupPath))
{
using (DirectorySearcher groupSearch = new DirectorySearcher(groupBinding))
{
using (DirectoryEntry groupEntry = groupSearch.FindOne().GetDirectoryEntry())
{
results.Add(string.Format("{0}", groupEntry.Properties["cn"].Value.ToString()));
}
}
}
}
catch
{
Logger.Error("User has bad roles");
}
Run Code Online (Sandbox Code Playgroud)
附加观察:代码实际上是在一个自定义的RoleProvider中,好奇的是,如果我在一个简单的winforms应用程序中引用这个提供程序,并使用相同的输入调用这个相同的方法,那么catch块就会完全按照它的设想执行.我认为这表明有关.NET异常与COM异常的建议答案并不准确.虽然我无法理解为什么从WebDev服务器执行时此代码无法捕获
我已经和ASP.net MVC合作了好几年了.我过去开发的大多数应用程序都是通过旧版Web应用程序的链接访问的.当用户到达我的某个应用程序时,我的应用程序只是从浏览器中读取一个cookie,表明该用户已通过遗留应用程序进行了身份验证.
现在,我终于开发了一个全新的Web应用程序,需要能够执行身份验证和授权.我确信我可以做点工作,但我想知道今天最好的做法是什么.
从ASP.net WebForms,我熟悉MembershipProvider和RoleProvider类.我对Windows Identity Foundatioin(WIF)也有一点熟悉.
但是,当我查看默认的ASP.net MVC 4应用程序时,"AccountController"类使用称为WebSecurity类的东西.我想知道这是否意味着折旧MembershipProvider和RoleProvider类.
这应该是基本设置,具有由另一个服务器提供的用户名/密码身份验证以及对特权资源的基于角色的访问.
今天在ASP.net MVC 4中实现这些的最佳实践是什么?
.net security roleprovider membership-provider asp.net-mvc-4
我已经实现了一个自定义角色提供程序,并在我的web.config文件中配置它,如下所示:
<roleManager enabled="true" defaultProvider="TDRoleProvider" cacheRolesInCookie="true">
<providers>
<clear/>
<add name="TDRoleProvider" type="TDRoleProvider"/>
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
我已经覆盖了我的自定义角色提供程序中的GetRolesForUser函数,我已经介入它,它运行得很好 - 为我正在测试的用户加载了60个角色.但是,我注意到每次调用User.IsInRole的请求都会调用GetRolesForUser.在我编写的其他应用程序中,它只调用一次,然后将结果缓存在cookie中.出于某种原因,缓存不适用于此应用程序.任何想法为什么?
我正在使用默认的Sitemap提供程序进行安全修整.但是,有些如何,我得到:
建立与SQL Server的连接时发生与网络相关或特定于实例的错误.
我认为站点地图提供商正在寻找错误位置的角色.我的配置是这样的:
<connectionStrings>
<add name="DB" ... />
</connectionStrings>
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="SqlProvider" .../>
</providers>
</membership>
<roleManager enabled="true">
<providers>
<add connectionStringName="DB" type="System.Web.Security.SqlRoleProvider" ... />
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
Sitemap标记的定义如下:
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true" >
<providers>
<clear/>
<add name="XmlSiteMapProvider"
description="Default SiteMap provider."
type="System.Web.XmlSiteMapProvider "
siteMapFile="Web.sitemap"
securityTrimmingEnabled="true" />
</providers>
</siteMap>
Run Code Online (Sandbox Code Playgroud)
为什么我得到sql错误?修剪如何获得角色?
编辑:

我正在开发一些网站,这是一种在线工作场所,会有一些用户和一些正在进行的计算机编程项目,每个用户可以有多个角色,例如一个特定用户可以是项目的项目经理和开发人员为另一个项目.自然地,项目经理比项目中的开发人员拥有更多的权限.我的问题是如何在我的代码中整齐地管理这个?我打算使用我的自定义角色提供程序并使用Authorize属性,但这还不够,因为我需要项目Id和用户ID来查找用户在特定项目中的角色.
我正在为我的asp.net mvc项目使用角色管理器和Windows身份验证,我们有2个角色,它们是查看者和编辑者.
<authentication mode="Windows" />
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
<providers>
<clear />
<add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
编辑器可以访问整个应用程序,但Viewer只能访问两个操作
我首先尝试为基本控制器设置Authorize属性,只允许编辑器访问所有内容:
[Authorize(Roles = "Editors")]
public class BaseController : Controller
Run Code Online (Sandbox Code Playgroud)
然后将Authorize属性添加到这两个操作:
[Authorize(Roles = "Viewers,Editors")]
public ActionResult Report(PaymentsUnallocatedAndQueriedModel model)
Run Code Online (Sandbox Code Playgroud)
它不起作用,它不允许观众访问任何有意义的动作.
我认为在每个操作的顶部重复授权属性并不是一个好主意.
你能否告诉我是否有更好的解决方案
我们将在WCF中使用自定义角色提供程序.重写的方法GetRolesForUser将需要使用已存在的RoleRepository.
现在,使用一个普通的类,我们使用StructureMap构造它,并且通过构造函数注入RoleRepository依赖项.
但是,它是WCF,它通过web.config中的roleManager属性来构造自定义角色提供程序类并且"完成".
我真的不想将RoleRepository depndency硬连接到自定义角色probvider类,但它看起来像我必须要的.
有任何想法吗?
是否有任何合理有效的方法来获取不属于特定角色的用户列表?
我能看到的唯一方法是
从数据库获取所有用户并执行签入代码
直接转到数据库并回避角色提供程序
我正在尝试在类库中创建自定义角色提供程序,由于某种原因我无法引用System.Web.Security.RoleProvider.
我System.Web在项目中添加了一个引用,但仍然没有运气.有什么理由不能这样做吗?
我在8个月前发布了这个问题.接受的答案涉及一些你不会通过默认提供商的规则播放而错过的东西.例如,如果您不使用从RoleProvider继承的自定义RoleProvider,则您将失去使用快速快捷方式的功能User.IsInRole().答案是指像"内置管道"这样的东西.
我想知道的是,我可以在哪里找到依赖于"内置管道"的完整列表,以及显示他们在幕后调用哪些重写方法的内容.
例如,HttpContext.Current.User.IsInRole()是(我假设)在我的自定义RoleProvider中引用并调用我的覆盖"IsUserInRole()"方法,但是我希望看到明确说明HttpContext.Current.User.IsInRole()实际调用的文档,IsUserInRole()对于所有提供者的所有此类方法.
我知道它应该是显而易见的(IsInRole()和IsUserInRole()是如此相似),但我的询问动机是看到并了解其他类型的可用的快捷方式,我甚至都不知道的.我有一种感觉,我已经多次重新发明了轮子,我甚至都不知道.
c# asp.net asp.net-membership roleprovider membership-provider
roleprovider ×10
asp.net ×6
c# ×6
.net ×2
roles ×2
asp.net-mvc ×1
cookies ×1
security ×1
structuremap ×1
wcf ×1