gpt4 book ai didi

cookies - ASP.NET 通用提供程序 - Roleprovider 不会在 cookie 中缓存角色

转载 作者:行者123 更新时间:2023-12-02 16:45:51 24 4
gpt4 key购买 nike

讽刺的是,我的角色提供者不再将角色缓存在 cookie 中。那是早些时候的工作。不幸的是我现在才注意到这一点,所以我不能说是什么原因导致了这个问题。但我认为这与通用提供程序新版本1.2的更新(8月16日发布)有关。

我的角色提供者配置如下:

 <roleManager enabled="true" cacheRolesInCookie="true" cookieName="X_Roles" 
cookiePath="/" cookieProtection="All" cookieRequireSSL="true" cookieSlidingExpiration="true" cookieTimeout="1440"
createPersistentCookie="false" domain="" maxCachedResults="25" defaultProvider="XManager_RoleProvider">
<providers>
<clear/>
<add name="XManager_RoleProvider" type="ManagersX.XManager_RoleProvider, AssemblyX"
connectionStringName="XEntities" applicationName="/" rolesTableName="Roles" roleMembershipsTableName="Users_Roles"/>
</providers>
</roleManager>

角色管理器(登录 View 、带有站点地图修剪的菜单等)一切正常,但它只是不再缓存角色。成员(member)提供程序、 session 状态等也工作正常,并且它们的 cookie 设置正确。

静态 Roles 类的所有属性均已正确设置,并且 Httpcontext 中的所有内容(IsSecureConnection 等)也都是正确的。

角色 cookie 之前已设置,但现在不再设置。我希望有人能帮助我解决我的问题。

提前致谢。

最诚挚的问候,

HeManNew

更新:请问没有人遇到同样的问题或给我提示吗?

最佳答案

下面是我编写的自定义角色提供程序的详细信息,该提供程序使用适当的缓存,并且不会在每次页面加载时访问数据库。

============ 我的代码隐藏文件==============

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Security;

namespace MyProject.Providers
{
public class CustomRoleProvider : RoleProvider
{
#region Properties

private static readonly object LockObject = new object();
private int _cacheTimeoutInMinutes = 0;

#endregion

#region Overrides of RoleProvider

public override void Initialize(string name, NameValueCollection config)
{
// Set Properties
ApplicationName = config["applicationName"];
_cacheTimeoutInMinutes = Convert.ToInt32(config["cacheTimeoutInMinutes"]);

// Call base method
base.Initialize(name, config);
}

/// <summary>
/// Gets a value indicating whether the specified user is in the specified role for the configured applicationName.
/// </summary>
/// <returns>
/// true if the specified user is in the specified role for the configured applicationName; otherwise, false.
/// </returns>
/// <param name="username">The user name to search for.</param><param name="roleName">The role to search in.</param>
public override bool IsUserInRole(string username, string roleName)
{
// Get Roles
var userRoles = GetRolesForUser(username);

// Return if exists
return userRoles.Contains(roleName);
}

/// <summary>
/// Gets a list of the roles that a specified user is in for the configured applicationName.
/// </summary>
/// <returns>
/// A string array containing the names of all the roles that the specified user is in for the configured applicationName.
/// </returns>
/// <param name="username">The user to return a list of roles for.</param>
public override string[] GetRolesForUser(string username)
{
// Return if User is not authenticated
if (!HttpContext.Current.User.Identity.IsAuthenticated) return null;

// Return if present in Cache
var cacheKey = string.format("UserRoles_{0}", username);
if (HttpRuntime.Cache[cacheKey] != null) return (string[]) HttpRuntime.Cache[cacheKey];

// Vars
var userRoles = new List<string>();
var sqlParams = new List<SqlParameter>
{
new SqlParameter("@ApplicationName", ApplicationName),
new SqlParameter("@UserName", username)
};

lock (LockObject)
{
// Run Stored Proc << Replace this block with your own Database Call Methods >>
using (IDataReader dr =
BaseDatabase.ExecuteDataReader("aspnet_UsersInRoles_GetRolesForUser", sqlParams.ToArray(),
Constants.DatabaseConnectionName) as SqlDataReader)
{
while (dr.Read())
{
userRoles.Add(dr["RoleName"].ToString());
}
}
}

// Store in Cache and expire after set minutes
HttpRuntime.Cache.Insert(cacheKey, userRoles.ToArray(), null,
DateTime.Now.AddMinutes(_cacheTimeoutInMinutes), Cache.NoSlidingExpiration);

// Return
return userRoles.ToArray();
}

/// <summary>
/// Gets or sets the name of the application to store and retrieve role information for.
/// </summary>
/// <returns>
/// The name of the application to store and retrieve role information for.
/// </returns>
public override sealed string ApplicationName { get; set; }

// I skipped the other methods as they do not apply to this scenario

#endregion
}
}

============我的代码隐藏文件结束==============

============ 我的 Web.Config 文件 ========================

<roleManager enabled="true" defaultProvider="CustomRoleManager">
<providers>
<clear />
<add name="SqlRoleManager" type="System.Web.Security.SqlRoleProvider" connectionStringName="AspnetDbConnection" applicationName="MyApplication"/>
<add name="CustomRoleManager" type="MyProject.Providers.CustomRoleProvider" connectionStringName="AspnetDbConnection" applicationName="MyApplication" cacheTimeoutInMinutes="30" />
</providers>
</roleManager>

============ 我的 Web.Config 文件结束 ================

缓存设置为每 30 分钟后自动过期。您可以根据需要进行修改。

干杯。

关于cookies - ASP.NET 通用提供程序 - Roleprovider 不会在 cookie 中缓存角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12259052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com