MicrosoftGraphAuthProvider 不尊重 [Authenticate("microsoftgraph")] 属性

MicrosoftGraphAuthProvider does not respect [Authenticate("microsoftgraph")] attribute

我们已经实现了 MicrosoftGraphAuthProvider 并且它都设置正确,因为我们添加了一个端点来使用以下内容输出授权用户的凭据:

 if (!IsAuthenticated) return null;
 var session = this.Request.GetSession(true);
 return session.ToJson();

这输出我的用户,提供者为 microsoftgraph。太棒了,一切都符合预期。

但是,当我们添加授权属性时:

 [Authenticate("microsoftgraph")]

它 returns 一个 401,就好像我们根本没有登录一样。所有 ss-id 和 ss-pid 都在 headers 中正确发送,但它仍然是 returns 401。

然而,在系统的其他地方,我们正在使用相同的方法来限制 API 密钥授权

  [Authenticate("apikey")]

我们目前有 3 个 IAuthProvider 加载到 API。

提供商本身是否存在问题,或者将服务限制为 microsfoftgraph 提供商背后是否存在不同的方法?

当您使用身份验证提供商名称时,例如:

[Authenticate("microsoftgraph")]

它告诉 ServiceStack 检查已注册的 AuthProvider 以确定它是否认为用户已通过身份验证,这是通过调用它的 IsAuthorized() 方法来完成的,MicrosoftGraphAuthProvider 没有定义,所以它使用它基础 OAuthProvider 实现:

public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null)
{
    if (request != null)
    {
        if (!LoginMatchesSession(session, request.UserName)) return false;
    }

    return session != null && session.IsAuthenticated && !string.IsNullOrEmpty(tokens?.AccessTokenSecret);
}

您可以通过覆盖 AuthProvider 并实施 IsAuthorized 或覆盖您的 Custom UserSession 并覆盖 IsAuthorized(provider) 来覆盖此行为,例如:

public class MyUserSession : AuthUserSession
{
    public override bool IsAuthorized(string provider)
    {
        if (provider == MicrosoftGraphAuthProvider.Name)
            return IsAuthenticated && AuthProvider == provider;
        return base.IsAuthorized(provider);
    }
}