【问题标题】:Refresh auth token for MS Graph with C#使用 C# 刷新 MS Graph 的身份验证令牌
【发布时间】:2016-12-14 21:36:26
【问题描述】:

如何刷新身份验证令牌 Microsoft Graph 使用 Microsoft Graph .NET Client Library 或其他使用 C#?

我目前正在做的是将令牌保留在静态类中:

public class TokenKeeper
{
    public static string token = null;
    public static string AcquireToken()
    {
        if (token == null || token.IsEmpty())
        {
            throw new Exception("Authorization Required.");
        }
        return token;
    }
    public static void Clear()
    {
        token = null;
    }
}

我在Startup类中填写token:

public partial class Startup
{
    private static string AppKey = CloudConfigurationManager.GetSetting("ida:Password");
    private static string aadInstance = CloudConfigurationManager.GetSetting("ida:AADInstance");
    private static string TenantName = CloudConfigurationManager.GetSetting("ida:Tenant");
    private static string Authority = String.Format(CultureInfo.InvariantCulture, aadInstance, TenantName);
    private static string graphResourceId = CloudConfigurationManager.GetSetting("ida:GraphUrl");
    private BpContext db = new BpContext();

    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }

    public void ConfigureAuth(IAppBuilder app)
    {
        string ClientId = CloudConfigurationManager.GetSetting("ida:ClientID");
        string Authority = "https://login.microsoftonline.com/common/";

        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = ClientId,
                Authority = Authority,
                Scope = "User.ReadBasic.All",
                //Details omitted
                    AuthorizationCodeReceived = (context) =>
                    {
                        var code = context.Code;
                        // Create a Client Credential Using an Application Key
                        ClientCredential credential = new ClientCredential(ClientId, AppKey);
                        string userObjectID = context.AuthenticationTicket.Identity.FindFirst(
                            "http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
                        AuthenticationContext authContext = new AuthenticationContext(Authority, new NaiveSessionCache(userObjectID));
                        AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
                            code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);                    
                        TokenKeeper.token = result.AccessToken;

                        return Task.FromResult(0);
                    }
                     //Details omitted
                }
            });
    }
}

我还会在退出时清除令牌。

【问题讨论】:

    标签: c# oauth dotnetopenauth microsoft-graph-api


    【解决方案1】:

    AuthenticationResult 对象包含访问令牌和刷新令牌。所以,刷新令牌也可以像访问令牌一样持久化在 TokenKeeper 中。当访问令牌过期时(由AuthenticationResult.ExpiresOn指示),使用刷新令牌和AuthenticationContext.AcquireTokenByRefreshToken方法来获取新的访问令牌。

    如果您不想显式跟踪刷新令牌,请参阅 ADAL Cache 了解 ADAL 库如何为您做到这一点。

    【讨论】:

    • AcquireTokenByRefreshToken 和 AcquireSilentAccessToken 不起作用。我得到了两个例外。对于第一个:异常表示用户未知(访问令牌和刷新令牌现在已缓存且正确,我验证了它),后者只是抛出 AdalAuthenticationReqiredException。
    • 他们是否更改了AuthenticationResult 对象或者您的意思是不同的对象,因为这里没有RefreshToken 这样的属性:docs.microsoft.com/en-us/dotnet/api/…:\
    【解决方案2】:

    您可以通过提供与 AccessToken 一起收到的 RefreshToken 来刷新访问令牌。由于您的代码中有可用的 ID/Secret,因此您可以使用它们来提供 ClientCredential。 代码示例是:

    var authContext = new AuthenticationContext("https://login.microsoftonline.com/common");
    var result = authContext.AcquireTokenByRefreshToken(refreshToken, new ClientCredential(ClientId, AppKey));

    【讨论】:

    • 我试过了,我从 MS Graph 中得到 ServiceException,提示用户未知。
    猜你喜欢
    • 2016-10-19
    • 2017-11-08
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2019-03-21
    • 2020-02-16
    • 2019-02-27
    • 2018-05-27
    相关资源
    最近更新 更多