值在角色提供程序上不能为空
本文关键字:不能 程序上 角色 | 更新日期: 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);
}
}