我有一个使用Azure B2C身份验证的ASP.Net MVC应用程序,以及用于授权用户访问应用程序部分的身份角色。但是,有一个问题是,大约一个小时后,角色似乎超时了。我目前的理论是,由于它使用cookie身份验证,因此cookie即将到期,因此该角色将被撤销。
配置此代码的代码如下:
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
CookieManager = new SystemWebCookieManager(),
SlidingExpiration = true
});
app.UseOpenIdConnectAuthentication( ...
请注意,此处未设置ExpireTimeSpan
。声明在此处添加:
public class MvcApplication : HttpApplication
{
void Application_PostAuthenticateRequest()
{
...
if (Request.IsAuthenticated)
{
var identity = ClaimsPrincipal.Current.Identities.First();
var myClaim = new Claim("Role", "admin");
identity.AddClaim(myClaim);
...
超时后,ClaimsPrincipal.Current.Claims
为空;所以我要添加的自定义声明以及MS发出的声明(例如nameidentifier)。如何清除它,以及设置(假设它是一个设置)告诉何时清除?
答案 0 :(得分:0)
我想问题出在设置
UseTokenLifetime = false
虽然没有设置
UseTokenLifetime = false
(在OpenIdConnectAuthenticationOptions中)
身份提供者发出的身份令牌会在一小时后到期(而cookie则不会)。并且不能在本地重新发行。应该执行新的挑战(到IdP的往返)以获得新的令牌。实际上你解释的行为(在某些时候仍然经过身份验证但错过了所有的cookie)看起来很麻烦,但可能解释不够充分。
无论如何,如果您想扩大身份令牌的生命周期,您可以更改IdP中的设置(但不确定Azure B2C是否提供此类设置),在OpenIdConnectAuthenticationOptions
中设置CC_SRC_PATH=github.com/fabcar/go
if [ "$LANGUAGE" = "node" -o "$LANGUAGE" = "NODE" ]; then
CC_SRC_PATH=/opt/gopath/src/github.com/fabcar/node
fi
,或者问题外部认证回调中您自己的令牌(包含您需要的所有Cookie和所需的生命周期)。但是,再一次,最简单的方法就是关闭滑动,依靠你的外部IdP,并在旧的到期时使用新的令牌。