首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Blazor服务器端-如何使用RevalidatingServerAuthenticationStateProvider继续检查令牌到期?

Blazor服务器端-如何使用RevalidatingServerAuthenticationStateProvider继续检查令牌到期?
EN

Stack Overflow用户
提问于 2020-09-25 14:39:11
回答 2查看 1.5K关注 0票数 3

我正在尝试创建一个RevalidatingServerAuthenticationStateProvider来检查ClaimsPrincipal是否过期。

我已经创建了它的实现(TokenExpiryAuthStateProvider)并在ConfigureServices中注册了它,但是构造函数从未被调用,ValidateAuthenticationStateAsync也没有。(我还尝试了实现工厂注册它,同样的结果)

我把AuthStateProvider注射到MainLayout上,看看注射了什么,现在还在注射ServerAuthenticationStateProvider。我做错什么了?

我的实现从未被称为:

代码语言:javascript
运行
复制
public class TokenExpiryAuthStateProvider : RevalidatingServerAuthenticationStateProvider
{
    protected override TimeSpan RevalidationInterval => TimeSpan.FromSeconds(10);

    public TokenExpiryAuthStateProvider(ILoggerFactory logger) : base(logger)
    {

    }

    protected override Task<bool> ValidateAuthenticationStateAsync(AuthenticationState authenticationState, CancellationToken cancellationToken)
    {
        DateTime expiry = authenticationState.User.GetExpiryDate();

        if (expiry < DateTime.UtcNow)
            return Task.FromResult(false);
        else
            return Task.FromResult(true);
    }
}

配置服务

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<HttpClientFactory>();

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
        services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.HttpOnly = true;
            options.SlidingExpiration = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
        });

        services.AddScoped<AuthenticationStateProvider, TokenExpiryAuthStateProvider>();

        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddHttpContextAccessor();

        services.AddCsla().WithBlazorServerSupport();            
    }

注入的物体:

更新:应该在此之前提到这一点.我目前正在处理一个服务器端项目,但是布局在一个共享的ui库中。因此,@enet提出的建议并不合适,因为RevalidatingServerAuthenticationStateProvider在共享项目中不可用,因此TokenExpiryAuthStateProvider仅在服务器项目中可用。

不过,根据enet的建议,我声明了一个接口并更新了ConfigureServices,这样我就可以将它插入到我的共享布局中来尝试了:

代码语言:javascript
运行
复制
services.AddScoped<TokenExpiryAuthStateProvider>();
services.AddScoped<ITokenExpiryProvider>(provider => 
        provider.GetRequiredService<TokenExpiryAuthStateProvider>());

然后,我向ITokenExpiryProvider注入了一个MainLayout,并订阅了AuthenticationStateChanged事件(我能看到的唯一事件)。刷新间隔后,未触发任何状态更改,也未调用ValidateAuthenticationStateAsync。如何启动重新验证过程,以及为什么AddScoped不能工作?

对于我的简单用例,创建一个带有AuthenticationStateProvider的timer类会更容易;这个类随后封装了auth状态的周期性检查,然后在会话到期时引发一个事件。(这就是我期望RevalidatingServerAuthenticationStateProvider工作的方式,每当ValidateAuthenticationStateAsync经过RefreshInterval时,就检查RefreshInterval)。

我仍然想知道为什么我的实现不能工作,为什么从来没有调用ValidateAuthenticationStateAsync;我一定是以某种方式错误地注册了服务。

EN

回答 2

Stack Overflow用户

发布于 2020-12-08 23:07:50

在实现自己的RevalidatingServerAuthenticationStateProvider时,我在Blazor应用程序中也出现了同样的问题。我发现这个问题是如何在Startup.cs中设置一切的顺序。

通过在设置身份验证提供程序之前调用services.AddRazorPages()services.AddServerSideBlazor(),我纠正了问题,现在在指定的RevalidationInterval上调用了ValidationAuthenticationStateAsync()方法。

下面是我的ConfigureServices(...)方法在我的Startup.cs中的缩写版本,作为一个例子:

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services)
{
    // These two need to be called before adding authentication
    services.AddRazorPages();
    services.AddServerSideBlazor();

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddOpenIdConnect();

    // This needs to be setup after setting up Blazor
    services.AddScoped<AuthenticationStateProvider, CustomRevalidatingAuthenticationStateProvider>();
}
票数 2
EN

Stack Overflow用户

发布于 2021-08-30 17:12:13

正如MkChandler所说,我正在调查为什么在服务器端将AuthenticationStateProvider转换为ServerAuthenticationStateProvider,这是导致错误的原因。

在找到这篇文章之后,我在services.AddServerSideBlazor();之前移动了services.AddScoped<AuthenticationStateProvider, ApiAuthenticationStateProvider>();,它成功了。

注意:当这个问题发生时,我正在尝试将整个blazor项目转换为blazor服务器端。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64066276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档