SqlRoleProvider:调用 Roles.GetRolesForUser 时出现 NullReferenceException

Posted

技术标签:

【中文标题】SqlRoleProvider:调用 Roles.GetRolesForUser 时出现 NullReferenceException【英文标题】:SqlRoleProvider: NullReferenceException when calling Roles.GetRolesForUser 【发布时间】:2014-03-05 01:24:31 【问题描述】:

场景: WCF 服务使用 SqlRoleProvider 对 Sql Server 2012 数据库服务器进行身份验证。 WCF 托管在 IIS7 网络服务器上。

请查看此错误:

System.NullReferenceException:对象引用未设置为对象的实例。 在 System.Web.Security.Roles.GetRolesForUser(字符串用户名)

角色管理已启用。

在我的本地开发机器(服务器 2012,iis7)上,这工作正常。当我登录并调用该方法时,将检索角色。

在另一台服务器(测试环境)上它不工作。我可以登录(用户通过用户身份验证并通过 sql server 数据库)但是当我尝试检索该用户的角色时,我得到一个 nullreferenceexception。

这怎么可能,有没有人知道这个问题可能发生在哪里?

最好的问候。

【问题讨论】:

【参考方案1】:

blergh

如果我遇到这个网站,请使用 Stack Overflow 标签进行谷歌搜索: http://www.lhotka.net/weblog/CallingRolesGetRolesForUserInAWCFService.aspx

简而言之: 显然 .net 3.5 和 .net 4 之间出现了问题。

要解决此问题,请致电:

string[] roles = Roles.Provider.GetRolesForUser(ServiceSecurityContext.Current.PrimaryIdentity.Name);

而不是

string[] roles = Roles.GetRolesForUser(ServiceSecurityContext.Current.PrimaryIdentity.Name);

区别在于添加在中间的.Provider。添加后效果很好。

【讨论】:

这对我有用,但我也必须调整所有出现的对“IsUserInRole()”的调用。奇怪的是,只有在使用 VS2013 启动解决方案时才需要修复。当在完全相同的机器上使用 VS2010 启动时,调用无需修改即可工作。仅供参考,如果重要的话,我有一个 .NET 3.5 WCF 项目。 我遇到了同样的问题。我在 Web.config 中向用户 Roles.GetRolesForUser 添加了以下行,否则您必须使用用户 Roles.Provider.GetRolesForUser。我正在使用启用了 OWIN 中间件的 MVC5。 【参考方案2】:

这个问题听起来像这个 asp.net 错误。

connect.microsoft.com

一种解决方法是调整您的 Web 服务器跟踪级别。例如,在 web.config 文件中添加以下设置可以解决问题,

<system.webServer>
    <tracing>
     <traceFailedRequests>
        <remove path="*"/>
        <add path="*">
         <traceAreas>
            <add provider="ASP" verbosity="Verbose" />
            <!-- Note that the verbosity is set to Warning (default value is Verbose)-->
            <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Warning" />
            <add provider="ISAPI Extension" verbosity="Verbose" />
            <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" />
         </traceAreas>
         <failureDefinitions statusCodes="200-999" />
        </add>
     </traceFailedRequests>
    </tracing>
</system.webServer>

【讨论】:

以上是关于SqlRoleProvider:调用 Roles.GetRolesForUser 时出现 NullReferenceException的主要内容,如果未能解决你的问题,请参考以下文章

ansible 角色定义及调用(nginx)

Ansible自动化部署之ROLES

Ansible之roles使用

Roles.GetRolesForUser 抛出异常对象引用未设置为对象的实例

Ansibel之roles的使用

Ansible角色管理-Roles(实例演示!!!)