值在角色提供程序上不能为空

本文关键字:不能 程序上 角色 | 更新日期: 2023-09-27 18:12:01

我是MVC c#的初学者。现在我试图建立一个自定义身份验证与角色提供者,但当它检查用户角色它得到一个错误,"值不能为空"。这是我的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); (value不能为null(userName))行上总是出现错误。我使用了调试指针,它显示网关从未被调用。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;
    }  

我的代码有问题吗?我怎么解决这个错误呢?

值在角色提供程序上不能为空

如果我删除或注释掉httpContext和所有的代码缓存…缓存部分代码有什么问题吗?@Win

我不会担心访问数据库,除非您正在开发企业应用程序,其中速度是一个问题,每个查询计数。原始ASP。网络会员提供程序根本不使用缓存。

此外,ASP。网络会员提供商是一项非常古老的技术- 超过十年的历史。如果您正在为企业应用程序实现,您可能需要考虑使用基于声明的身份验证。

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

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);
    }
}
相关文章: