C# Azure AD B2C-角色管理
我有一个与Azure AD B2C连接的Asp.NET MVC应用程序 在管理员设置中,我创建了管理员组: 在我的代码中,我想使用C# Azure AD B2C-角色管理,c#,asp.net-mvc,azure,asp.net-mvc-5,azure-ad-b2c,C#,Asp.net Mvc,Azure,Asp.net Mvc 5,Azure Ad B2c,我有一个与Azure AD B2C连接的Asp.NET MVC应用程序 在管理员设置中,我创建了管理员组: 在我的代码中,我想使用[Authorize(Roles=“Administrator”)] 使用常规的Azure Active Directory很容易添加(只需3行代码)。但是对于Azure AD B2C,我在网上找不到任何有效的教程或示例。也许你可以告诉我需要修改什么 下面是我的Startup.Auth.cs的ConfigureAuth方法 public void Configure
[Authorize(Roles=“Administrator”)]
使用常规的Azure Active Directory很容易添加(只需3行代码)。但是对于Azure AD B2C,我在网上找不到任何有效的教程或示例。也许你可以告诉我需要修改什么
下面是我的Startup.Auth.cs的ConfigureAuth方法
public void ConfigureAuth(IAppBuilder应用程序)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(新的CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
新的OpenIdConnectAuthenticationOptions
{
//使用租户和策略信息生成元数据地址
MetadataAddress=String.Format(AadInstance、租户、DefaultPolicy),
//这些是标准的OpenID连接参数,其值来自web.config
ClientId=ClientId,
RedirectUri=RedirectUri,
PostLogoutRedirectUri=RedirectUri,
//为每种类型的通知指定回调
通知=新的OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider=OnRedirectToIdentityProvider,
AuthorizationCodeReceived=OnAuthorizationCodeReceived,
AuthenticationFailed=OnAuthenticationFailed,
},
//指定要验证的声明
TokenValidationParameters=新的TokenValidationParameters
{
NameClaimType=“name”
},
//通过将所有请求的作用域追加到一个字符串中(用空格分隔)来指定作用域
Scope=$“openid配置文件脱机访问{ReadTasksScope}{WriteTasksScope}”
}
);
}
Azure AD B2C尚未在其发送给应用程序的令牌中包含组声明,因此您不能采用与Azure AD相同的方法(在令牌中包含组声明)
您可以在Azure AD B2C反馈论坛中投票支持此功能:
也就是说,您可以在此应用程序中做一些额外的工作,让它手动检索组声明的这些声明,并将它们注入令牌中
首先,注册一个单独的应用程序,该应用程序将调用Microsoft Graph来检索组声明
https://yourtenant.onmicrosoft.com/groups
)https://login.microsoftonline.com/YOUR_TENANT.onmicrosoft.com/adminconsent?client_id=YOUR_CLIENT_ID&state=12345&redirect_uri=YOUR_REDIRECT_URI
OnAuthorizationCodeReceived
处理程序中添加以下代码:
var权限=$”https://login.microsoftonline.com/{租户}”;
var graphCca=新的机密客户端应用程序(GraphClientId、authority、GraphRedirectUri、新的ClientCredential(GraphClientSecret)、userTokenCache、null);
字符串[]范围=新字符串[]{”https://graph.microsoft.com/.default" };
尝试
{
AuthenticationResult AuthenticationResult=等待graphCca.AcquireTokenForClientAsync(作用域);
字符串令牌=authenticationResult.AccessToken;
使用(var client=new HttpClient())
{
字符串requestUrl=$”https://graph.microsoft.com/v1.0/users/{SignedUserId}/memberOf?$select=displayName”;
HttpRequestMessage请求=新的HttpRequestMessage(HttpMethod.Get,requestUrl);
request.Headers.Authorization=新的AuthenticationHeaderValue(“承载者”,令牌);
HttpResponseMessage response=等待客户端.SendAsync(请求);
var responseString=await response.Content.ReadAsStringAsync();
var json=JObject.Parse(responseString);
foreach(json[“值”]中的var组)
notification.AuthenticationTicket.Identity.AddClaim(新的System.Security.Claims.ClaimTypes(System.Security.Claims.ClaimTypes.Role,组[“displayName”].ToString(),System.Security.ClaimValueTypes.String,“图形”);
//TODO:处理分页。
// https://developer.microsoft.com/en-us/graph/docs/concepts/paging
//如果用户是100多个组的成员,
//您需要检索下一页的结果。
}
}捕获(例外情况除外)
{
//TODO:手柄
投掷;
}
首先非常感谢您的回答!我只剩下两个问题了。我应该在哪里添加该URL(步骤4)以及什么是重定向uri(这是b2c的回复uri吗?)?代码的另一个问题:我应该填写哪些变量:-GraphClientId-GraphRedirectUri-GraphClientSecret-userTokenCache和VisualStudio正在调用错误消息:new c.Claim非常感谢您的帮助:-)进行更新以进一步澄清应用程序注册说明并解决c.Claim问题。GraphClientId=您注册的应用程序的应用程序ID,GraphSecret=应用程序机密,GraphRedirectUri=您指定的重定向URI,userTokenCache应该已经从从示例接收的OnAuthorizationCode中已经存在的代码中定义。最后让它工作起来-如果其他人需要答案:重定向URI与azure门户中的相同。在链接中,您需要将“common”更改为您的b2c租户ID。再次感谢您的帮助,因为您没有修改实际的令牌。您正在向在内存af中生成的令牌的.Net抽象中添加声明