使用asp.net Identity进行Azure AD身份验证以进行授权

时间:2016-08-24 09:57:12

标签: c# asp.net-mvc authentication azure-active-directory

我试图在互联网上寻找,但却看不出我是如何实现我所要求的。这是我的企业应用程序,它使用Asp.net Identity进行基于表单的身份验证。我已将用户和角色与群组一起扩展,以便在我的代码中提供授权。 (注意:不使用任何组/角色指令)。

现在我被要求查看更改代码以适应Azure Active Directory身份验证的可能性。我试着阅读如何注册应用程序,将用户发送到Azure网站进行身份验证,获取令牌等等。但是我仍然坚持'之后的事情?'我已经过身份验证的用户如何使用我现有的Asp.net Identity模型,其中用户存储在sql数据库中。如何使用此标记来关联现有用户。

此外,当我将项目更改为允许Azure AD时,它会删除Aspnet.Identity包,因为它与Azure AD不兼容!!

我甚至尝试手动将两个软件包并排放置,我指出用户被发送到Azure上进行身份验证的位置,转移回主页并再次以永无止境的循环登录Azure AD。

总结问题,如何从AAD验证用户并继续使用现有的角色和组授权。

修改 我尝试创建单独的Web服务,它将验证用户身份并发送JWT令牌。哪个有用,如果我直接在浏览器上调用它,但是,当我尝试从我的网络应用程序调用此服务时,我得到了奇怪的错误

 Application with identifier 'a2d2---------------' was not found in the directory azurewebsites.net

这里奇怪的部分是目录的名称是'azurewebsites.net',而不是我正在使用的默认目录。

更新 这是抛出错误的代码

public async Task<ActionResult> Login(string returnUrl)
        {


            try
            {

                // get the access token
                AuthenticationContext authContext = new AuthenticationContext(authority, new TokenCache());

                var clientCredential = new ClientCredential(clientId, password);
//Error on below line
                AuthenticationResult result = await authContext.AcquireTokenAsync(resourceId, clientCredential);


                // give it to the server to get a JWT
                HttpClient httpClient = new HttpClient();
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
......

2 个答案:

答案 0 :(得分:0)

尝试一下:

var client = new RestClient("https://login.microsoftonline.com/{tenant- 
         Id}/oauth2/v2.0/token");
var request = new RestRequest(Method.POST);         
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/x-www-form-urlencoded");         
request.AddHeader("grant_type", "password");
request.AddParameter("application/x-www-form-urlencoded", 
        "grant_type=password&client_id={client-Id}&client_secret={client- 
        secret}&scope={scopeurl}&userName={username}&password={password}", 
        ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
var json = response.Content;
var JSONObject = JObject.Parse(json);
var token = (string)JSONObject["access_token"];

答案 1 :(得分:-1)

我遇到了类似的问题,所以我创建了一个Office 365 owin安全插件。我在github上分享了代码。它基于codeplex的katana project

您可以在https://github.com/chadwjames/wakizashi找到源代码。

您需要注册申请here。注册应用程序时,将回调uri设置为https://yourdomain/signin-office365

应用程序ID是您的客户端ID,密码是您的客户端密钥。

注册后,您可以修改Startup.Auth.cs并将其添加到ConfigureAuth方法中。

        //setup office 365
        var office365Options = new Office365AuthenticationOptions
        {
            ClientId = ConfigurationManager.AppSettings["ada:ClientId"],
            ClientSecret = ConfigurationManager.AppSettings["ada:ClientSecret"],
            Provider = new Office365AuthenticationProvider
            {
                OnAuthenticated = async context =>
                {
                    await
                        Task.Run(
                            () => context.Identity.AddClaim(new Claim("Office365AccessToken", context.AccessToken)));
                }
            },
            SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie
        };

        office365Options.Scope.Add("offline_access");
        app.UseOffice365Authentication(office365Options);

当我有更多时间时,我希望为此创建一个nuget包。