C# Azure AD B2C-角色管理

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

我有一个与Azure AD B2C连接的Asp.NET MVC应用程序

在管理员设置中,我创建了管理员组:

在我的代码中,我想使用
[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来检索组声明

  • 创建具有应用程序权限的应用程序:Directory.Read.All
  • 通过单击“生成新密码”添加应用程序机密
  • 添加一个平台并选择Web并为其提供任何重定向URI(例如
    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抽象中添加声明