在开发具有成员资格功能的站点时,大多数人是否使用.NET的SqlMembershipProvider,SqlRoleProvider和SqlProfileProvider?
或者许多人完全建立自己的提供者,甚至自己的会员制度?
SQL提供程序的哪些限制会让您自己推出?
是否可以轻松扩展SQL提供程序以提供其他功能?
对于Reference
Per Scott Gu的博客,Microsoft提供了SqlMembershipProvider的源代码,以便您可以自定义它,而不是从头开始.只是一个FYI.
c# asp.net sqlmembershipprovider sqlroleprovider sqlprofileprovider
我的MVC应用程序在单个页面请求期间在多个位置使用用户角色.我的问题是默认的SqlRoleProvider是否在页面请求的生命周期中缓存当前用户的角色?
例如,我在Controller方法的属性中使用Roles:
[Authorize(Roles = "Admin")]
Run Code Online (Sandbox Code Playgroud)
和自定义代码
if (user.IsInRole(MembershipRole.Admin))
{
// Do something
}
else if (user.IsInRole(MembershipRole.Printer))
{
// Do something else
}
Run Code Online (Sandbox Code Playgroud)
如果角色提供程序不缓存角色,是编写从默认角色继承的自定义角色提供程序的最佳解决方案,并覆盖方法以获取角色一次并在请求持续时间内缓存它们?这可以通过Authorize属性和我自己的代码都将使用缓存的角色来完成吗?
(如果您想知道,我不想使用cacheRolesInCookie web.config选项来缓存cookie中的角色).
在此先感谢您的任何建议.
[编辑以包含Joe回答触发的详细信息]
我反编译了System.Web.Mvc.AuthorizeAttribute,AuthorizeCore方法为每个要检查的角色调用以下方法:
httpContext.User.IsInRole
Run Code Online (Sandbox Code Playgroud)
然后窥视System.Web.Security.RolePrincipal(这就是"User"在上面),下面的方法确实使用了用户角色的缓存副本(或者如果为空则填充缓存):
public string[] GetRoles()
public bool IsInRole(string role)
Run Code Online (Sandbox Code Playgroud)
缓存作为字段存储在User上,因此其生命周期是在请求期间.
方法使用以下方法查找角色:
Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name)
Run Code Online (Sandbox Code Playgroud)
因此将使用您为应用程序选择的任何角色提供程序(默认或自定义).
场景:使用SqlRoleProvider进行Sql Server 2012数据库服务器身份验证的WCF服务.WCF托管在IIS7 Web服务器上.
请看这个错误:
System.NullReferenceException:未将对象引用设置为对象的实例.
在System.Web.Security.Roles.GetRolesForUser(String username)
RoleManagement已启用.
在我的本地开发机器(服务器2012,iis7)上,这工作正常.当我登录并调用该方法时,将检索角色.
在另一台服务器(测试环境)上,它无法正常工作.我可以登录(用户通过用户身份验证并通过sql server数据库)但是当我尝试检索该用户的角色时,我得到一个nullreferenceexception.
这怎么可能,有没有人有任何线索可以解决这个问题?
最好的祝福.
我正在使用库存MS Forms Authentication和SqlRolesProvider在IIS7(Server '08)上运行ASP.NET 3.5应用程序.(我使用aspnet_regsql工具生成表).
我们有三个角色:SysAdmins,AppAdmins和Users.所有用户都在用户中,用户可以使用SysAdmins,AppAdmins或两者.
我似乎无法获得一个Admin目录来阻止访问不在SysAdmins和AppAdmins中的用户.它允许所有登录用户,或任何人.
以下是我当前配置的相关位:
<configuration>
...
<system.web>
<authentication mode="Forms">
<forms loginUrl="/client/security/login.aspx" timeout="480" />
</authentication>
<authorization>
</authorization>
<roleManager defaultProvider="SqlRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName="EquityTouch.Roles" cookieProtection="All" cookieSlidingExpiration="true" cookieTimeout="60">
<providers>
<clear />
<add name="SqlRoleProvider" applicationName="EquityTouch" connectionStringName="SQLProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
...
</system.web>
<system.webServer>
<security>
<authorization>
<add accessType="Deny" users="?" />
</authorization>
</security>
...
</system.webServer>
<location path="admin">
<system.webServer>
<security>
<authorization>
<remove users="*" roles="" verbs=""/>
<add accessType="Allow" roles="SysAdmins,AppAdmins" />
</authorization>
</security>
</system.webServer>
<system.web>
<authorization>
<deny users="*"/>
<allow roles="SysAdmins,AppAdmins"/> …Run Code Online (Sandbox Code Playgroud) 我需要一个具有以下功能的RoleProvider:
动态分配角色到任务
认证/授权IPrincipals基于他们有权访问的系统中的动态分配任务
报告显示当前登录的用户以及其他常见用法统计信息.
我很确定我将不得不自己动手,但我想确保我不会错过任何OSS甚至是MS.
我也在使用ASP.NET MVC,所以我的基本计划是编写一个自定义属性,如:[Authorize(Task=Tasks.DeleteClient)]
将它放在需要授权的方法上.我将根据用户在数据库中配置的任何设置,根据角色授权任务,而不是根据角色进行授权.
思考?