如何在招摇中访问图形api?
Posted
技术标签:
【中文标题】如何在招摇中访问图形api?【英文标题】:How to access graph api in swagger? 【发布时间】:2020-02-24 09:52:33 【问题描述】:网络核心项目。我的要求如下。我在 .net core 和 swagger 中有 webapi 项目。我在 azure ad 中创建了两个应用程序。现在我已经大摇大摆地授权按钮。我想做如下授权。如果用户属于名称以 AP 开头的任何组,我想授权这些用户。坦率地说,我在这里有点困惑。现在我在 azure 中有两个应用程序。每当我通过 azure AD 中的 swagger/swagger 应用程序获取令牌时,可以使用相同的令牌来访问我的 api?我将展示我的实现。
下面是我的 appsettings.json
"AzureAd":
"Authority": "login.microsoftonline.com/common/v2.0",
"Instance": "https://login.microsoftonline.com/",
"Domain": "[Enter the domain of your tenant, e.g. contoso.onmicrosoft.com]",
"TenantId": "organizations",
"ClientId": "my web api azure ad app client id",
"CallbackPath": "/signin-oidc"
,
"Swagger":
"ClientId": "my swagger app azure ad app client id",
"ClientSecret": "my secrete",
"AuthorizationUrl": "https://login.microsoftonline.com/tenantid/oauth2/v2.0/authorize",
"TokenUrl": "https://login.microsoftonline.com/tenantid/oauth2/v2.0/token"
下面是我的启动
services
.AddAuthentication(o =>
o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
)
.AddJwtBearer(o =>
o.Authority = azureActiveDirectoryOptions.Authority;
o.RequireHttpsMetadata = false;
o.TokenValidationParameters = new TokenValidationParameters
ValidAudiences = new List<string>
azureActiveDirectoryOptions.AppIdUri,
azureActiveDirectoryOptions.ClientId
,
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = "https://myorg.onmicrosoft.com/oauth2/default",
RoleClaimType = ClaimTypes.Role,
;
);
services.AddSwaggerGen(c =>
c.SwaggerDoc("v1", new Info Title = "My API", Version = "v1" );
c.AddSecurityDefinition("oauth2", new OAuth2Scheme
Type = "oauth2",
Flow = "implicit",
AuthorizationUrl = swaggerUIOptions.AuthorizationUrl,
TokenUrl = swaggerUIOptions.TokenUrl,
Scopes = new Dictionary<string, string>
"User.read", "https://graph.microsoft.com/User.read"
);
c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
"oauth2", new[] "readAccess", "writeAccess"
);
services.AddAuthorization(options =>
options.AddPolicy("APGroupsOnly", policy =>
policy.Requirements.Add(new GroupsCheckRequirement("YourGroupID")));
);
下面是配置方法。
app.UseSwaggerUI(c =>
c.RoutePrefix = "swagger";
c.OAuthClientId(swaggerUIOptions.ClientId);
c.OAuthClientSecret(swaggerUIOptions.ClientSecret);
c.OAuthRealm(azureActiveDirectoryOptions.ClientId);
c.OAuthAppName("Swagger");
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
);
这是我的需求实现。每当我大摇大摆地跑时,我都会得到令牌。现在我想用这个token来调用graph api。获取组详细信息后,我想点击我的 api。现在我的困惑是,我在 swagger/swagger 应用程序中获取令牌,所以相同的令牌可以用于获取组详细信息和授权 api 吗?有人可以指导我吗?任何帮助,将不胜感激。谢谢
【问题讨论】:
你能简化一下这个问题吗?是不是你想用同一个token从2个APP调用Graph API? 嗨,普拉尚特。我想使用组实现授权。我的客户是大摇大摆的。我在 azure ad 中有两个应用程序,用于 swagger 和 we api。 【参考方案1】:据我了解,目前您有:
Swagger/Swagger 应用程序,我认为您的客户将使用它来访问您的 API。我将其称为客户端应用程序。在您的 AAD 中注册了一个应用程序(APP-Client),用户将通过该应用程序获得访问令牌。
您的 Web API 服务器,受 AAD (APP-Server) 保护并接受用户的请求。
工作流程是:
1)。用户在 Swagger 应用程序(使用 APP-Client)中获取令牌(Token-For-API)。
2)。用户使用令牌 (Token-For-API) 调用您的应用程序。
3)。您的 API 将为用户调用 Graph API,并返回结果。
目前,您对步骤 1) 和 2) 没有任何问题。所以,接下来,我可能会给你一些关于3)的建议。
根据 Azure AD 开发人员文档,您可以使用代理流。您的 Web API 服务器(守护程序应用程序)可以使用第一个令牌来获取用于访问 Microsoft Graph API 或其他 API 的新令牌。
步骤如下:
A.您需要在 AAD (APP-Server) 中为您的 API 添加 Graph API 的权限。
B.获取新token,使用新token调用graph API:
[HttpGet]
public IActionResult Get()
// Web API app info
string aadInstance = "https://login.microsoftonline.com/0";
string tenant = "your tenant name or id, for example: hanxia.onmicrosoft.com";
string clientId = "The app for your web API: 01801a37-****-****-****-baf08b61c63f";
string clientSecret = "The secret of the app, OKg1UY/**********u@oao91P.p/";
// Get the token which a user uses to access your API
var token = _httpContextAccessor.HttpContext.GetTokenAsync("access_token").Result;
// Get current user info
var current = _httpContextAccessor.HttpContext.User;
string userName = current.FindFirst(ClaimTypes.Upn) != null ? current.FindFirst(ClaimTypes.Upn).Value : current.FindFirst(ClaimTypes.Email).Value;
// Create user assertion
UserAssertion userAssertion = new UserAssertion(token, "urn:ietf:params:oauth:grant-type:jwt-bearer",userName);
// Acquire a token of the user for graph
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
AuthenticationContext authContext = new AuthenticationContext(authority);
var graph_token = authContext.AcquireTokenAsync("https://graph.microsoft.com", new ClientCredential(clientId,clientSecret), userAssertion).Result.AccessToken;
// Call graph
string graphUrl = "https://graph.microsoft.com/v1.0/groups";
HttpClient hc = new HttpClient();
hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", graph_token);
hc.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
hc.DefaultRequestHeaders.TryAddWithoutValidation("Cache-Control", "no-cache");
var result = hc.GetAsync(graphUrl).Result.Content.ReadAsStringAsync().Result;
hc.Dispose();
return Ok(result);
最后,如果你想调用更多的图形API,你只需要在AAD中为你的Web API应用(APP-Server)添加必要的权限。要知道需要哪些权限,可以参考具体的API doc。例如,在这种情况下,您想获取用户的组信息,那么您可以调用List groups。然后,您需要至少添加以下权限之一:
【讨论】:
嘿,谢谢您正确理解要求。我现在正在实施这个。非常感谢以上是关于如何在招摇中访问图形api?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 SPA 或图形界面的情况下,仅通过 POSTMAN 访问 Laravel Sanctum 的 API 路由?