gpt4 book ai didi

asp.net-mvc - Azure Active Directory - 存储访问 token 的 MVC 应用程序最佳实践

转载 作者:行者123 更新时间:2023-12-02 02:29:34 26 4
gpt4 key购买 nike

我使用 Azure Active Directory (AAD) 设置了一个简单的 MVC 应用程序。

我需要查询 AAD Graph API 才能从我的应用程序管理应用程序角色和组。

Startup类中,我收到了这样的AccessToken:

public void ConfigureAuth(IAppBuilder app)
{
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseCookieAuthentication(new CookieAuthenticationOptions());

app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = Constants.ClientId,
Authority = Constants.Authority,
PostLogoutRedirectUri = Constants.PostLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
// If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
AuthorizationCodeReceived = (context) =>
{
var code = context.Code;
var credential = new ClientCredential(Constants.ClientId, Constants.ClientSecret);
var signedInUserId =
context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
var authContext = new AuthenticationContext(Constants.Authority,
new TokenDbCache(signedInUserId));
var result = authContext.AcquireTokenByAuthorizationCode(
code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential,
Constants.GraphUrl);

var accessToken = result.AccessToken;
return Task.FromResult(0);
}
}
});
}

要实例化 ActiveDirectoryClient 类,我需要传递 AccessToken:

var servicePointUri = new Uri("https://graph.windows.net");
var serviceRoot = new Uri(servicePointUri, tenantID);
var activeDirectoryClient = new ActiveDirectoryClient(serviceRoot,
async () => await GetTokenForApplication());

我想知道将 AccessToken 存储为声明是否是一个好的解决方案(在 Startup 类中添加行)?

context.AuthenticationTicket.Identity.AddClaim(new 
Claim("OpenId_AccessToken", result.AccessToken));

编辑 token 已存储..

得到它!谢谢乔治。所以我的 token 已使用 TokenDbCache 类存储在数据库中。

根据示例再次获取它(在我的一个 Controller 中):

public async Task<string> GetTokenForApplication()
{
string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

// get a token for the Graph without triggering any user interaction (from the cache, via multi-resource refresh token, etc)
ClientCredential clientcred = new ClientCredential(clientId, appKey);
// initialize AuthenticationContext with the token cache of the currently signed in user, as kept in the app's database
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID, new TokenDbCache<ApplicationDbContext>(signedInUserID));
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenSilentAsync(graphResourceID, clientcred, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));
return authenticationResult.AccessToken;
}

我从 AuthenticationContext 中不知道的内容:如果已请求 token ,它将从 TokenDbCache 中检索它。

最佳答案

当您通过 Adal 检索 token 时,它会将其缓存在 NaiveCache 对象中。

使用 StartUp 类检索 token 的代码:

  AuthenticationResult kdAPiresult = authContext.AcquireTokenByAuthorizationCode(code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, "Your API Resource ID");
string kdAccessToken = kdAPiresult.AccessToken;

在 Azure Active Directory 示例 ( https://github.com/AzureADSamples ) 中,此对象用于检索应用 Controller 内的 token 。您可以实现自己的缓存,以相同的方式检索它。

在 Controller 代码中,您可以执行以下操作:

IOwinContext owinContext = HttpContext.GetOwinContext();
string userObjectID = owinContext.Authentication.User.Claims.First(c => c.Type == Configuration.ClaimsObjectidentifier).Value;
NaiveSessionCache cache = new NaiveSessionCache(userObjectID);
AuthenticationContext authContext = new AuthenticationContext(Configuration.Authority, cache);
TokenCacheItem kdAPITokenCache = authContext.TokenCache.ReadItems().Where(c => c.Resource == "You API Resource ID").FirstOrDefault();

如果您不是通过 AuthenticationContext(3d 方 API)获取 token ,也可以在声明中存储 token

关于asp.net-mvc - Azure Active Directory - 存储访问 token 的 MVC 应用程序最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com