MSAL을 사용하여 웹 API 앱에 액세스하는 데 사용되는 ID 토큰을 가져 왔습니다. 몇 가지 질문이 있는데 누군가가 내가 무슨 일이 일어나는지 이해할 수 있는지 궁금합니다. MSAL 및 Azure AD : 사용자 ID를 얻고 싶을 때 어떤 범위를 통과해야합니까?
나 클라이언트 측의 인증 프로세스를 시작하자. 이 경우 현재 사용자를 인증하기 위해 다음 코드를 사용하는 Windows Forms 앱을 구축하고 있습니다 (즉, 웹에 액세스하려고 할 때 사용자를 확인하는 데 사용되는 ID 토큰을 얻으려면) API 앱) ://constructor code
_clientApp = new PublicClientApplication(ClientId,
Authority, //which url here?
TokenCacheHelper.GetUserCache());
_scopes = new []{ "user.read" }; //what to put here?
//inside a helper method
try {
return await _clientApp.AcquireTokenSilentAsync(_scopes, _clientApp.Users.FirstOrDefault());
}
catch (MsalUiRequiredException ex) {
try {
return await _clientApp.AcquireTokenAsync(_scopes);
}
catch (MsalException ex) {
return null;
}
}
가장 먼저 분명히하고 싶은 것은 authority 매개 변수에 사용해야하는 값입니다. 이 경우, 내가 양식에 URL을 사용하고 있습니다 : 그러나
https://login.microsoftonline.com/{Tenant}/oauth2/v2.0/token
, 나는이 같은 멀리 얻을 수있는 인상을 해요 :
https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
이 하나의 종단점이 내 Azure 광고에만 해당하는 것처럼 보이지만 다른 URL은 일반 URL처럼 보이는 것 같습니다 ... 어디서이 종단점에 대한 자세한 정보를 찾을 수 있으며 각각의 목적은 무엇입니까?
또 다른 것 내가 이해할 수없는 부분이 범위입니다. 나는 MS Graph (또는 다른 Azure 관련 서비스에 관해서는 그 문제에 대해)에 관심이 없다. 이전 버전의 MSAL 라이브러리에서는 기본 범위 중 하나를 참조 할 수있었습니다. 그러나, 그것은 더 이상 가능하지 않습니다 (적어도, 나는 시도하고 기본 범위를 통과해서는 안된다는 예외가 ...).
빈 모음 (예 : new List<string>()
) 또는 null
을 전달하면 오류가 발생합니다. 그래서,이 경우에는 user.read
범위를 통과하지 못했습니다 (내가 실수하지 않으면 MS Graph API에서 사용됩니다.) 이것은 분명히 필요하지는 않지만 인증을 관리하는 유일한 방법이었습니다 ID 토큰을 가져와야 할 때 호출을 수행하는 방법에 대한 단서가 있습니까? 다른 메서드를 호출해야합니까?
서버 측으로 이동하면 액세스 권한이있는 웹 API 응용 프로그램이 있습니다. .이 sample에 따르면,이 같은 사용해야하는 인증 헤더 (무기명)에서 ID 토큰을 통과 통화 제한 :
private void ConfigureAuth(IAppBuilder app) {
var authority = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
app.UseOAuthBearerAuthentication(
new OAuthBearerAuthenticationOptions {
AccessTokenFormat = new JwtFormat(GetTokenValidationParameters(),
new OpenIdConnectCachingSecurityTokenProvider(authority)),
Provider = new OAuthBearerAuthenticationProvider {
OnValidateIdentity = ValidateIdentity
}
});
}
자,이가하는 일을하고는 모든 요청에 대해 401를 반환하는 돈 버지니아가 있어요. 뚜껑 ID 토큰. 그러나 한 가지 질문이 있습니다. 사용자 이름 (컨트롤러의 User.Identity.Name
)을 식별하는 데 사용해야하는 티켓 ID에서 클레임을 지정하는 방법이 있습니까? 당신이 볼 수 있듯이
private Task ValidateIdentity(OAuthValidateIdentityContext arg) {
//username not getting correctly filled
//so, i'm handling this event in order to set it up
//from the preferred_username claim
if (!arg.HasError && arg.IsValidated) {
var identity = arg.Ticket.Identity;
var username = identity.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value ?? "";
if (!string.IsNullOrEmpty(username)) {
identity.AddClaim(new Claim(ClaimTypes.Name, username));
}
}
return Task.CompletedTask;
}
, 나는 ID 토큰에서 preferred_username 주장 찾고 있어요이었다 (이 경우, I는 다음과 같습니다 코드로 그렇게하기 위해 OnValidateIdentity
처리 종료했습니다 그 값을 사용하여 이름 클레임을 설정합니다. 이 작업을 자동으로 수행 할 수있는 옵션이 있습니까? OAuthBearerAuthenticationMiddleware
의 구성에서 뭔가가 누락 되었습니까? 당신의 먼저 쿼리에 대해서는
안녕하세요 Mohit. 1 도움. 2, 정말로. 예를 들어, 일부 범위는 기본적으로 전송되며 내가 말한 것처럼 범위 컬렉션에서 다시 사용할 수는 없습니다. 3에 대해서는 답변을 찾았습니다. https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/f10a045459e7cb07548806561a47ecdb3471f5f6/src/Microsoft.IdentityModel.Tokens/TokenValidationParameters.cs#L413 –