角色提供者的值不能为空

Value can not be null on Role Provider

我是 MVC C# 的初学者。现在我正在尝试使用角色提供程序构建自定义身份验证,但是当它检查用户角色时收到 "Value can not be null" 错误。 这是我的 RoleProvider:

public class MyRoleProvider:RoleProvider
{
    private int _cacheTimeoutInMinute = 20;
    LoginGateway gateway=new LoginGateway();


public override string[] GetRolesForUser(string username)
    {
        if (!HttpContext.Current.User.Identity.IsAuthenticated)
        {
            return null;
        }

        //check cache
        var cacheKey = string.Format("{0}_role", username);
        if (HttpRuntime.Cache[cacheKey] != null)
        {
            return (string[])HttpRuntime.Cache[cacheKey];
        }
        string[] roles

            = gateway.GetUserRole(username).ToArray();
            if (roles.Any())
            {
                HttpRuntime.Cache.Insert(cacheKey, roles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinute), Cache.NoSlidingExpiration);

            }

        return roles;
    }
public override bool IsUserInRole(string username, string roleName)
    {
        var userRoles = GetRolesForUser(username);
            return userRoles.Contains(roleName);   

    }

它总是在 reurn userRoles.Contains(roleName);(值不能为 null(用户名))行上出错。我使用了调试指针,它显示网关从未 invoked.I,e: string[] roles = gateway.GetUserRole(username).ToArray(); 所以角色始终保持为空。 虽然我不确定网关上的 GetUserRole 方法是否正确:这是我的网关:

public string[] GetUserRole(string userName)
    {

        string role = null;
        SqlConnection connection = new SqlConnection(connectionString);
        string query = "select r.RoleType from RoleTable r join UserRoleTable ur on ur.RoleId=r.Id join UserTable u on u.UserId=ur.UserId where u.UserName='"+userName+"'";
        SqlCommand command = new SqlCommand(query, connection);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            role = reader["RoleType"].ToString();

        }
        string[] roles = {role};
        reader.Close();
        connection.Close();
        return roles;
    }  

我的代码有问题吗?我该如何解决这个错误?

it works if I delete or comment out httpContext and all code for cache...Is there Anything wrong with cache portion code?? @Win

我不会担心访问数据库,除非您正在开发企业应用程序,其中速度是一个问题并且每个查询都很重要。 原来的ASP.Net Membership Provider 根本不使用缓存。

此外,ASP.Net Membership Provider 是一项非常古老的技术 - 已有十多年历史。如果您正在为企业应用程序实施,您可能需要考虑使用基于声明的身份验证。

这里是缓存服务,如果你想使用 -

using System;
using System.Collections.Generic;
using System.Runtime.Caching;

public class CacheService 
{
    protected ObjectCache Cache => MemoryCache.Default;

    public T Get<T>(string key)
    {
        return (T) Cache[key];
    }

    public void Set(string key, object data, int cacheTime)
    {
        if (data == null)
            return;

        var policy = new CacheItemPolicy();
        policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
        Cache.Add(new CacheItem(key, data), policy);
    }

    public void Remove(string key)
    {
        Cache.Remove(key);
    }
}