asp.net程序通过Microsoft Azure令牌授予流获取UserInfo终结点实现单点登录--隐式授予流(OIDC协议)
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是用户的显示名称(可能重复...)