我正在try 将Azure Redis缓存添加到我的.NET 8 API中.我添加了连接字符串,并添加了如下代码:

services.AddStackExchangeRedisCache(
    options =>
    {
        options.Configuration = builder.Configuration.GetConnectionString("RedisCache");
        options.InstanceName = builder.Environment.EnvironmentName;
    })
.AddDistributedMemoryCache();

当我在连接字符串中添加我的密码时,这是有效的.但我不想这样做,我想使用Entra ID身份验证.因此,我启用了该选项,并 Select 了需要使用它的Web应用程序(也是在Azure中).访问策略AS data owner.但是,当我省略密码时,我会收到一个错误:

StackExchange.Redis.RedisConnectionException:‘消息超时 在Backlog中try 发送,因为没有连接 可用(5000ms)-上次连接异常:身份验证失败 在tsg-pas-dev-redis.redis.cache.windows.net:6380/Interactive,上 已刷新/ComputeResult,最后:回应,来源:SetResult,未完成:0, 上次读取时间:0s前,上次写入时间:0s前,Keep-Alive:60s,状态: 已连接正在建立,管理器:10个中的9个可用,最后一个心跳:从不, 全局:0S前,v:2.6.122.38350,命令=设置,超时:5000,实例: 12,QU:1,QS:0,AW:FALSE,BW:SpinningDown,rs:ReadAsync,ws: 已刷新、输入:0、后进:0、当前输入:0、同步操作:1、异步操作:1、 服务器终端:tsg-pas-dev-redis.redis.cache.windows.net:6380, 连接秒:0.23,AOC:0,MC:1/1/0,管理器:10个可用, 客户端名称:DBSX1Y6-54977(SE.Redis-v2.6.122.38350),IOCP: (忙=1,空闲=999,最小=8,最大=https://stackexchange.github.io/StackExchange.Redis/Timeouts0),工人: (忙碌=1,空闲=32766,最小=8,最大=32767),池: (线程=15,队列条目=0,完成条目=347,计时器=3),v: 2.6.122.38350(请阅读本文,了解一些可能导致超时的常见客户端问题: https://stackexchange.github.io/StackExchange.Redis/Timeouts)‘

异常:错误:需要NOAUTH身份验证.验证Redis是否 提供的密码正确.try 的命令:ECHO

你知道我错过了什么吗?我记得,对于其他服务之一,我必须做一些主要的事情,获取/初始化令牌……但不知道这是否相关.

--编辑: 在回答下面的问题后,我做了一个小更改,这样我仍然可以使用IDistributedCache,因为在本地我仍然可以使用内存缓存:

public static void AddDistributedCache(this IServiceCollection services, WebApplicationBuilder builder)
{
    if (builder.Configuration["UseMemoryCache"]?.Equals("yes", StringComparison.OrdinalIgnoreCase) ?? true)
    {
        services.AddDistributedMemoryCache();
    }
    else
    {
        services.AddStackExchangeRedisCache(options =>
        {
            options.InstanceName = builder.Environment.EnvironmentName;
            options.ConnectionMultiplexerFactory = () => ConnectionMultiplexerFactory(builder);
        })
        .AddDistributedMemoryCache();
    }
}

private static async Task<IConnectionMultiplexer> ConnectionMultiplexerFactory(WebApplicationBuilder builder)
{
    var configurationOptions = await ConfigurationOptions.Parse(builder.Configuration.GetConnectionString("RedisCache")!)
        .ConfigureForAzureWithTokenCredentialAsync("XXXX", new DefaultAzureCredential());

    var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions);

    return connectionMultiplexer;
}

XXX需要来自应用程序设置,尽管我还不明白我为什么需要它.当在同一个Redis AChe实例上使用多个应用程序时,我想还不是很方便……但至少没有密码:) 这样做的好处是,我可以很容易地切换,也不必担心多路复用器getDatabase等.

推荐答案

根据可用的文档here,为了使用Entra ID身份验证,您需要使用Microsoft.Azure.StackExchangeRedis Nuget包.

同样的代码样例可以在这里找到:https://github.com/Azure/Microsoft.Azure.StackExchangeRedis/tree/main/sample.

通过该链接,使用DefaultAzureCredential的示例代码:

Write("Redis cache host name: ");
cacheHostName = ReadLine()?.Trim();
Write("'Username' from the 'Data Access Configuration' blade on the Azure Cache for Redis resource): ");
var username = ReadLine()?.Trim();

Write("Connecting using TokenCredential...");
configurationOptions = await ConfigurationOptions.Parse($"{cacheHostName}:6380").ConfigureForAzureWithTokenCredentialAsync(username!, new DefaultAzureCredential());
configurationOptions.AbortOnConnectFail = true; // Fail fast for the purposes of this sample. In production code, this should remain false to retry connections on startup
LogTokenEvents(configurationOptions);

connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions, connectionLog);

Csharp相关问答推荐

ß != ss与ICU进行不区分大小写的比较

如何从顶部提取发票号作为单词发票后的第一个匹配

如何使用while循环实现异常处理

(乌龙)1&#比c#中的UL&#慢吗?

如何定义EFCore中的多个穿透

更新产品但丢失产品ASP.NET Core的形象

MongoDB.NET-将数据绑定到模型类,但无法读取整数值

自动映射程序在GroupBy之后使用项目

需要在重新启动ApplicartionPool或IIS后启动/唤醒API的帮助

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

当前代码Cosmos DB 3.37.1:PartitionKey key key mismatch exception

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

如何从非异步任务中正确返回TypeResult

岛屿和框架中的自定义控件库.Navigate-AccessViolationException

RCL在毛伊岛应用程序和Blazor服务器应用程序.Net 8.0中使用页面

EF Core 7-忽略模型绑定中的虚拟属性

如何使用.NET 8.0中新的CompositeFormat类?

在C#和HttpClient中使用REST API

Excel将';@';添加到具有范围的公式中

更新实体框架上的被跟踪实体