asp.net程序通过Microsoft Azure令牌授予流获取UserInfo终结点实现单点登录--隐式授予流

发布时间 2023-04-17 16:14:11作者: 黑星2010

1. Microsoft Azure令牌授予流
令牌授予流种类如下:

本章节采用: 隐式授予流;

2. 隐式授予流的实现
流程:重定向到authorize--->拿到access_token--->通过access_token获取UserInfo

2.1. 重定向到authorize
重定向地址:
https://login.microsoftonline.com/40cfad67-3660-44d8-9f4XXXXXXXXXXXX/oauth2/v2.0/authorize?client_id=6c506942-6837-42ab-XXXXXXXXXXX&redirect_uri=http://localhost:XXXXX/OidcCallback.aspx&response_type=token id_token&scope=openid profile&nonce=xyz&state=abc&grant_type=implicit

2.2. 拿到access_token
回调页面OidcCallback.aspx中,通过Request.QueryString["access_token"]能取到授权码access_token值;
注意:回调时,url类似:OidcCallback.aspx#code=XXXXXXXXXXXXX,其中#是锚点,跟?的意思不一样,必须处理成?后才可以通过QueryString来取值;

2.3. 通过access_token获取UserInfo
GET接口:
https://graph.microsoft.com/oidc/userinfo

参数:
请求header中增加Authorization,值为Bearer access_token
比如:
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(getUrl));
webReq.Headers.Add("Authorization", "Bearer " + token);

成功的响应:

{
    "sub": "OLu859SGc2Sr9ZsqbkG-QbeLgJlb41KcdiPoLYNpSFA",
    "name": "Mikah Ollenburg",  scope.
    "family_name": " Ollenburg",
    "given_name": "Mikah",
    "picture": "https://graph.microsoft.com/v1.0/me/photo/$value",
    "email": "mikoll@contoso.com"  
}

其中sub就是用户的唯一标志,name是用户的显示名称(可能重复...)