Microsoft Identity 本地用户帐户和 MSAL
Microsoft Identity Local User Accounts and MSAL
我有一个 Blazor 服务器应用程序,它使用 Microsoft Identity 和本地用户帐户。它工作得很好;但是,我想扩展该应用程序以访问 Office 365,即邮件、日历和共享点文档库。这可以通过 Microsoft Graph 完成,但所有文档都指出将 Microsoft Identity 用于工作或学校帐户而不是本地用户帐户。我不想更改 Blazor 应用程序,因为我还将添加对其他云服务的支持。主要问题是我是否可以将我的 Blazor 应用程序保留为 Microsoft Identity,并使用 MSAL 或其他具有“代表用户”访问权限的东西,捕获或要求用户一次输入 office 365 的 his/her 凭据和从而获得访问权限?
目标是让 blazor 服务器端应用 运行 本地帐户并提示一次用户的 Office365 登录,获取访问权限并检索数据。下次用户登录该应用程序时,他无需登录 Office365 即可让该应用程序以用户身份访问电子邮件、日历和共享点网站。
在与 ADAL、MSAL 和其他用于 Azure 的 OAUT2 身份验证的包装器进行了较量之后,我找到了一个简单的解决方案,它让我想起了 KISS(保持简单 S!”#$%)方面。有时我们会想太多问题,这是我的情况。
在 Azure AD 中注册应用程序后,请确保您的重定向 URI 与应用程序页面、组件或捕获身份验证代码的方法相匹配。我使用了以下代码(这是在 Razor 组件中,因为我使用的是 Blazor 服务器应用程序):
string AuthUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
string ReqUrl = AuthUrl + "?scope=";
ReqUrl += string.Join("+", scopes);
ReqUrl += "&response_type=code";
ReqUrl += "&client_id=" + [Replace these brackets with your Client ID];
ReqUrl += "&redirect_uri=[Replace these brackets with your redirect URI for your app page]";
ReqUrl += "&prompt=consent";
ReqUrl += "&response_mode=query";
NavManager.NavigateTo(ReqUrl);
由于此代码导航到 Azure AD 身份验证,如果成功通过身份验证,它将重定向到我的 Blazor 服务器应用程序中的另一个 razor 组件,以捕获查询字符串中的授权代码,可以使用 System.Web代码如下:
QueryHelpers.ParseQuery(uri.Query).TryGetValue("code", out [Replace with Code Variable])
然后您可以获取访问令牌,只需再次使用与身份验证相同的过程,使用 Post 而不是 Get:
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("client_id", [Replace with CLient ID]),
new KeyValuePair<string, string>("scope", string.Join(" ", scopes)),
new KeyValuePair<string, string>("grant_type", "[Insert Authorization Code you got in the query string]"),
new KeyValuePair<string, string>("code", HttpUtility.UrlEncode([Replace with Authentication Code])),
new KeyValuePair<string, string>("redirect_uri", "[Redirect URI from App Registration]")
}
);
HttpResponseMessage response = await client.PostAsync("/common/oauth2/v2.0/token", content);
var str = response.Content.ReadAsStringAsync().Result;
此访问代码 PostAsync 的另一个重要方面是范围由 space 分隔,而不是身份验证中的加号“+”。
从这里开始,不使用库的唯一警告是您必须实现自己的令牌缓存和更新。来自访问令牌获取的响应将 return 访问令牌、到期日期和刷新令牌。我使用了关于如何获取访问令牌的 Archived Lab Manual 来指导我并在 C#/Blazor 中复制它。
我希望这可以帮助任何其他一直想要实现相同目标的人,即在链接到 Office 365 帐户的 Blazor 服务器应用程序中拥有本地帐户,以便通过 MS Graph 访问邮件和其他资源.如果有什么需要进一步说明的,请随时发送消息。
编码愉快!
是的,我得出了类似的结论并实施了几乎相同的解决方案 - 但愿我先看到这个 post。
非常令人失望 Microsoft.Identity.Web 似乎不支持个人帐户 - 我感到有点暴露必须从第一原则有效地实施与身份验证一样重要的东西。
如果您想迁移到 Blazor WASM,这种方法仍然存在挑战。访问令牌的安全缓存一直是我在客户端关注的问题。我浪费了很多时间试图找出如何使用当前库将 Azure 身份验证与 Indiv 帐户集成。 (注意我想发表评论,但我没有足够的声誉)
我有一个 Blazor 服务器应用程序,它使用 Microsoft Identity 和本地用户帐户。它工作得很好;但是,我想扩展该应用程序以访问 Office 365,即邮件、日历和共享点文档库。这可以通过 Microsoft Graph 完成,但所有文档都指出将 Microsoft Identity 用于工作或学校帐户而不是本地用户帐户。我不想更改 Blazor 应用程序,因为我还将添加对其他云服务的支持。主要问题是我是否可以将我的 Blazor 应用程序保留为 Microsoft Identity,并使用 MSAL 或其他具有“代表用户”访问权限的东西,捕获或要求用户一次输入 office 365 的 his/her 凭据和从而获得访问权限?
目标是让 blazor 服务器端应用 运行 本地帐户并提示一次用户的 Office365 登录,获取访问权限并检索数据。下次用户登录该应用程序时,他无需登录 Office365 即可让该应用程序以用户身份访问电子邮件、日历和共享点网站。
在与 ADAL、MSAL 和其他用于 Azure 的 OAUT2 身份验证的包装器进行了较量之后,我找到了一个简单的解决方案,它让我想起了 KISS(保持简单 S!”#$%)方面。有时我们会想太多问题,这是我的情况。
在 Azure AD 中注册应用程序后,请确保您的重定向 URI 与应用程序页面、组件或捕获身份验证代码的方法相匹配。我使用了以下代码(这是在 Razor 组件中,因为我使用的是 Blazor 服务器应用程序):
string AuthUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
string ReqUrl = AuthUrl + "?scope=";
ReqUrl += string.Join("+", scopes);
ReqUrl += "&response_type=code";
ReqUrl += "&client_id=" + [Replace these brackets with your Client ID];
ReqUrl += "&redirect_uri=[Replace these brackets with your redirect URI for your app page]";
ReqUrl += "&prompt=consent";
ReqUrl += "&response_mode=query";
NavManager.NavigateTo(ReqUrl);
由于此代码导航到 Azure AD 身份验证,如果成功通过身份验证,它将重定向到我的 Blazor 服务器应用程序中的另一个 razor 组件,以捕获查询字符串中的授权代码,可以使用 System.Web代码如下:
QueryHelpers.ParseQuery(uri.Query).TryGetValue("code", out [Replace with Code Variable])
然后您可以获取访问令牌,只需再次使用与身份验证相同的过程,使用 Post 而不是 Get:
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("client_id", [Replace with CLient ID]),
new KeyValuePair<string, string>("scope", string.Join(" ", scopes)),
new KeyValuePair<string, string>("grant_type", "[Insert Authorization Code you got in the query string]"),
new KeyValuePair<string, string>("code", HttpUtility.UrlEncode([Replace with Authentication Code])),
new KeyValuePair<string, string>("redirect_uri", "[Redirect URI from App Registration]")
}
);
HttpResponseMessage response = await client.PostAsync("/common/oauth2/v2.0/token", content);
var str = response.Content.ReadAsStringAsync().Result;
此访问代码 PostAsync 的另一个重要方面是范围由 space 分隔,而不是身份验证中的加号“+”。
从这里开始,不使用库的唯一警告是您必须实现自己的令牌缓存和更新。来自访问令牌获取的响应将 return 访问令牌、到期日期和刷新令牌。我使用了关于如何获取访问令牌的 Archived Lab Manual 来指导我并在 C#/Blazor 中复制它。
我希望这可以帮助任何其他一直想要实现相同目标的人,即在链接到 Office 365 帐户的 Blazor 服务器应用程序中拥有本地帐户,以便通过 MS Graph 访问邮件和其他资源.如果有什么需要进一步说明的,请随时发送消息。
编码愉快!
是的,我得出了类似的结论并实施了几乎相同的解决方案 - 但愿我先看到这个 post。
非常令人失望 Microsoft.Identity.Web 似乎不支持个人帐户 - 我感到有点暴露必须从第一原则有效地实施与身份验证一样重要的东西。
如果您想迁移到 Blazor WASM,这种方法仍然存在挑战。访问令牌的安全缓存一直是我在客户端关注的问题。我浪费了很多时间试图找出如何使用当前库将 Azure 身份验证与 Indiv 帐户集成。 (注意我想发表评论,但我没有足够的声誉)