Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc SimpleMembership:AuthorizeAttribute和User.IsInRole不工作_Asp.net Mvc_Simplemembership - Fatal编程技术网

Asp.net mvc SimpleMembership:AuthorizeAttribute和User.IsInRole不工作

Asp.net mvc SimpleMembership:AuthorizeAttribute和User.IsInRole不工作,asp.net-mvc,simplemembership,Asp.net Mvc,Simplemembership,在过去的一周里,我一直在绞尽脑汁,我在这里或其他地方找到的答案似乎都没有起到任何作用。我有一个使用SimpleMembership的ASP.NET MVC5应用程序。我有一个名为OrganizationsController的控制器,它具有以下属性: [Authorize(Roles = "Administrator")] 我已经检查了数据库,我登录的用户确实是“管理员”角色。但是,对于此角色,Authorize属性和User.IsInRole()都不会返回“true” 有人建议: Autho

在过去的一周里,我一直在绞尽脑汁,我在这里或其他地方找到的答案似乎都没有起到任何作用。我有一个使用SimpleMembership的ASP.NET MVC5应用程序。我有一个名为OrganizationsController的控制器,它具有以下属性:

[Authorize(Roles = "Administrator")]
我已经检查了数据库,我登录的用户确实是“管理员”角色。但是,对于此角色,Authorize属性和User.IsInRole()都不会返回“true”

有人建议:

AuthorizeAttribute对存储在HttpContext.User中的IPrincipal实例调用IsInRole方法。默认情况下,IPrincipal没有角色,在这种情况下,IsInRole将始终返回false。这就是拒绝访问您的操作的原因

我使用了该答案中建议的以下代码,但authTicket.UserData仍然为空

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      string[] roles = authTicket.UserData.Split(',');
      GenericPrincipal userPrincipal = new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
      Context.User = userPrincipal;
    }
}
我不知道出了什么问题。为什么我可以登录,但找不到任何角色

下面是web.config的一些相关部分:

 <roleManager enabled="true" defaultProvider="SimpleRoleProvider">
      <providers>
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>


    <membership defaultProvider="SimpleMembershipProvider">
      <providers>
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>

    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" cookieless="UseCookies" />
    </authentication>

这是我定义的InitializeSimpleMembership属性:

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
{
    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Ensure ASP.NET Simple Membership is initialized only once per app start
        LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
    }

    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        {
            Database.SetInitializer<UsersContext>(null);

            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }

                if (!WebSecurity.Initialized)
                {
                    WebSecurity.InitializeDatabaseConnection("VerhaalLokaalDbContext", "UserProfile", "UserId", "UserName", autoCreateTables: true);
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
            }
        }
    }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple=false,Inherited=true)]
公共密封类InitializeSimpleMembershipAttribute:ActionFilterAttribute
{
私有静态SimpleMembershipInitializer\u initializer;
私有静态对象_initializerLock=新对象();
私有静态布尔值初始化;
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
//确保每次应用程序启动仅初始化一次ASP.NET简单成员身份
LazyInitializer.确保重新初始化(参考初始值设定项,参考初始值设定项,参考初始值设定项锁定);
}
私有类SimpleMembershipInitializer
{
公共SimpleMembershipInitializer()
{
Database.SetInitializer(null);
尝试
{
使用(var context=new UsersContext())
{
如果(!context.Database.Exists())
{
//创建没有实体框架迁移模式的SimpleMembership数据库
((IObjectContextAdapter)context.ObjectContext.CreateDatabase();
}
}
如果(!WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection(“VerhaalLokaalDbContext”、“UserProfile”、“UserId”、“UserName”、autoCreateTables:true);
}
}
捕获(例外情况除外)
{
抛出新的InvalidOperationException(“无法初始化ASP.NET简单成员身份数据库。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=256588“,ex);
}
}
}
}
InitializeSimpleMembership属性仅在AccountController上设置


这到底是怎么回事?为什么找不到在数据库中定义并绑定到用户的角色?

我们使用
System.Web.Security.roles.GetRolesForUser(…)
调用,然后强制检查这些角色数组中的交叉点。在我们的例子中,这一切都发生在自定义的
AuthorizeAttribute
classes'()调用中。扩展属性对您来说可能不是必需的,但我想为下面的代码片段提供一些上下文。我们只使用主体来获取用户名

e、 g


希望有帮助!我相信还有一种更有效的方法,我刚刚掸掉了我们两年来一直在使用的东西。

似乎是您自己回答的:“InitializeSimpleMembership属性仅在AccountController上设置”。您正在向OrganizationController请求某些内容,因此RoleProvider无法初始化。它在AccountController中也不起作用,因此不可能是这样。
var userRoles = System.Web.Security.Roles.GetRolesForUser(username);
var allowedRoles = Roles.Split(','); // Roles is a property on the Authorize attribute
var matches = userRoles.Intersect(allowedRoles).ToArray();
if ( matches.Length > 0 ) // true if user is in an allowed role, otherwise it is not