2.2身份验证开发

在我们的案例中,我们是用户通过Web应用程序进行身份识别。

上面的图示说明了如下的一些概念

l Azure AD 是标识提供程序,负责对组织的目录中存在的用户和应用程序的标识进行验证,并最终在那些用户和应用程序成功通过身份验证时颁发安全令牌。

l 希望将身份验证外包给 Azure AD 的应用程序必须在 Azure AD 中进行注册,Azure AD 将在目录中注册并唯一地标识该应用程序。

l 在用户通过身份验证后,应用程序必须对用户的安全令牌进行验证以确保身份验证对于目标方是成功的。

l 身份验证过程的请求和响应流是由所使用的身份验证协议(例如 OAuth 2.0、OpenID Connect、WS-Federation 或 SAML 2.0)决定的

这章我们将简单的对Azure AD的开发进行入门性的尝试,包括身份验证登录、基本身份信息的存储。要完成Azure AD的应用开发需要在Azure门户和开发环境中各自完成一些工作。

Azure AD开发部分

首先我们需要引入以下组件库

  1. Microsoft.IdentityModel.Clients.ActiveDirectory
  2. Microsoft.IdentityModel.Protocol.Extensions
  3. Microsoft.Owin
  4. Microsoft.Owin.Host.SystemWeb
  5. Microsoft.Owin.Security
  6. Microsoft.Owin.Security.Cookies
  7. Microsoft.Owin.Security.OpenIdConnect
  8. Microsoft.Web.Infrastructure
  9. Microsoft.WindowsAzure.ConfigurationManager.
  10. System.IdentityModel.Tokens.Jwt

其次我们需要在Web.config文件的appSettings节添加如下配置节点

  1. <ADD KEY="IDA:CLIENTID" VALUE=" " />
  2. <ADD KEY="IDA:TENANT" VALUE=" " />
  3. <ADD KEY="IDA:TENANTID" VALUE="" />
  4. <ADD KEY="IDA:AADINSTANCE" VALUE="HTTPS://LOGIN.CHINACLOUDAPI.CN/{0}" />
  5. <ADD KEY="IDA:POSTLOGOUTREDIRECTURI" VALUE=" " />
  6. <ADD KEY="IDA:GRAPHURL" VALUE="HTTPS://GRAPH.CHINACLOUDAPI.CN" />
  7. <ADD KEY="IDA:APPKEY" VALUE="" />

注意,由于我们使用的是世纪互联的版本,所以ida:AADInstance、ida:GraphUrl的Url将固定为https://login.chinacloudapi.cn/{0}https://graph.chinacloudapi.cn。关于其他的配置值将在Azure AD门户部分讲解。

然后我们需要编写AuthenticationHelper类来辅助我们处理有关授权的基本处理,AuthenticationHelper有两大部分,第一部分是通过静态字段来读取在Web.config文件的appSettings节配置的有关Azure AD的信息。

  1. public static readonly string Tenant = CloudConfigurationManager.GetSetting("ida:Tenant");
  2. public static readonly string TenantId = CloudConfigurationManager.GetSetting("ida:TenantId");
  3. public static readonly string LoginUrl = CloudConfigurationManager.GetSetting("ida:AADInstance");
  4. public static readonly string GraphUrl = CloudConfigurationManager.GetSetting("ida:GraphUrl");
  5. public static readonly string AppKey = CloudConfigurationManager.GetSetting("ida:AppKey");
  6. public static readonly string AuthorityUrl = String.Format(CultureInfo.InvariantCulture, LoginUrl, TenantId);
  7. public static readonly string AuthString = CloudConfigurationManager.GetSetting("ida:Auth") + CloudConfigurationManager.GetSetting("ida:Tenant");
  8. public static readonly string ClaimsSchemas = "http://schemas.microsoft.com/identity/claims/objectidentifier";
  9. public static readonly string ClientId = CloudConfigurationManager.GetSetting("ida:ClientId");
  10. public static readonly string ClientSecret = CloudConfigurationManager.GetSetting("ida:ClientSecret");
  11. public static readonly string PostLogoutRedirectUri = CloudConfigurationManager.GetSetting("ida:PostLogoutRedirectUri");

你已经注意到了,上面的代码在读取配置的时候没有使用我们传统的WebConfigurationManager类,而是采用了Azure新加入的CloudConfigurationManager类,该类是用于访问 Microsoft Azure 配置设置的静态类,可以从运行应用程序的平台的相应配置存储中读取配置设置。Microsoft Azure 外部环境中运行的 .NET 应用程序通常在 web.config 或 app.config 文件中存储配置设置。不管在哪个环境中运行代码,都可以使用CloudConfigurationManager 类从适当的配置文件中读取设置。

然后在AuthenticationHelper中添加一个方法AcquireTokenAsync,这个方法用于返回当前的用户凭证,如果没有凭证则抛出异常。

  1. public static string Token;
  2.  
  3. public static async Task<string> AcquireTokenAsync()
  4. {
  5. if (Token == null || Token.IsEmpty())
  6. {
  7. throw new Exception("Authorization Required.");
  8. }
  9. return Token;
  10. }

然后我们再添加GetActiveDirectoryClient方法来获取对Azure AD的客户端对象引用。

  1. public static ActiveDirectoryClient GetActiveDirectoryClient()
  2. {
  3. Uri baseServiceUri = new Uri(GraphUrl);
  4. ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(new Uri(baseServiceUri, TenantId), async () => await AcquireTokenAsync());
  5. return activeDirectoryClient;
  6. }

AuthenticationHelper到此就完成了,我们建立一个控制器AzureActiveDirectoryController,这个控制器将包含以下方法来使用AuthenticationHelper类。

  1. SignIn
  2.  
  3. SignOut

SignIn登录

代码非常简单,在当前上下文的采用OpenID进行身份询问获取

  1. public void SignIn()
  2. {
  3. if (!Request.IsAuthenticated)
  4. {
  5. HttpContext.GetOwinContext()
  6. .Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" },
  7. OpenIdConnectAuthenticationDefaults.AuthenticationType);
  8. }
  9. }

SignOut登出

同样代码简单明确

  1. public void SignOut()
  2. {
  3. string userObjectID = ClaimsPrincipal.Current.FindFirst(AuthenticationHelper.ClaimsSchemas).Value;
  4. var authContext = new AuthenticationContext(AuthenticationHelper.AuthorityUrl, new NaiveSessionCache(userObjectID));
  5. authContext.TokenCache.Clear();
  6. AuthenticationHelper.Token = null;
  7. HttpContext.GetOwinContext().Authentication.SignOut(OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
  8. }

好了,现在登入登出的代码已经完成了,我们可以尝试下载我们的MVC Web APP中执行体验下。在MVC自己建立的架构中我们可以循着View\ Shared\ _LoginPartial.cshtml找到通用的登入登出的View界面,然后修改代码为

  1. @if (Request.IsAuthenticated)
  2. {
  3. <text>
  4. <ul class="nav navbar-nav navbar-right">
  5. <li class="navbar-text">
  6. Hello, @User.Identity.Name!
  7. </li>
  8. <li>
  9. @Html.ActionLink("Sign out", "SignOut", "AzureActiveDirectory")
  10. </li>
  11. </ul>
  12. </text>
  13. }
  14. else
  15. {
  16. <ul class="nav navbar-nav navbar-right">
  17. <li>@Html.ActionLink("Sign in", "SignIn", "AzureActiveDirectory", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>
  18. </ul>
  19. }

上面的代码通过一个if完成登陆后出现Sign out链接和登出状态为Sign in链接。然后在View\ Shared\ _LoginPartial.cshtml加入这个_LoginPartial.cshtml我们就在主模板拥有了登录登出的链接功能。我对_LoginPartial.cshtml此处的修改如下

  1. <div class="navbar-collapse collapse">
  2. <ul class="nav navbar-nav">
  3. <li>@Html.ActionLink("主页", "Index", "Home")</li>
  4. <li>@Html.ActionLink("关于", "About", "Home")</li>
  5. <li>@Html.ActionLink("联系方式", "Contact", "Home")</li>
  6. </ul>
  7. @Html.Partial("_LoginPartial")
  8. </div>

现在我们执行代码后,我们看到的默认页面是

点击Sign in链接后将跳转到微软的登录界面

点击账号后

输入正确的密码后,将跳回我们应用的默认首页,并且明显的发现我们已经使用了正确的身份登入了。

无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证-2.2身份验证开发]的更多相关文章

  1. 无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证]

    二.使用Azure AD进行身份验证 之所以将Azure AD 作为开始,是应为基本上我们所有应用都需要进行安全管理.Azure Active Directory (Azure AD) 通过以下方式简 ...

  2. 无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证--2.1使用Azure AD需要了解几个概念]

    2.1使用Azure AD需要了解几个概念 l Azure AD目录 当你注册 Microsoft 云服务时,便会获得一个 Azure AD 目录.你可根据需要创建更多的目录.例如,可以将第一个目录保 ...

  3. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息]

    三.使用Azure AD管理用户信息 在上一章我们采用OpenID的方案和Azure AD交互进行身份验证,本章节我们继续了解如何在Azure AD中创建用户,列出用户信息,修改用户信息和删除用户信息 ...

  4. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.4 Edit修改用户信息]

    3.4 Edit修改用户信息 我们用FormCollection简化了表单提交,非常方便的进行用户信息修改. [HttpPost, Authorize] public async Task<Ac ...

  5. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.3 Details用户详细信息]

    3.3 Details用户详细信息 用户详细信息是通过objectId获取.代码如下 public async Task<ActionResult> Details(string obje ...

  6. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.2 Create创建用户]

    3.2 Create创建用户 [HttpPost, Authorize] public async Task<ActionResult> Create( [Bind(Include = & ...

  7. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.1 Index用户列表]

    3.1 Index用户列表 或许当前域下的用户列表 [Authorize] public async Task<ActionResult> Index() { var userList = ...

  8. 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.5 Delete删除用户]

    3.5 Delete删除用户 删除也是通过ObjectID获得对象进行删除 [Authorize] public async Task<ActionResult> Delete(strin ...

  9. 无责任Windows Azure SDK .NET开发入门(二):使用Azure AD 进行身份验证

    <編者按>本篇为系列文章,带领读者轻松进入Windows Azure SDK .NET开发平台.本文为第二篇,将教导读者使用Azure AD进行身分验证.也推荐读者阅读无责任Windows ...

随机推荐

  1. poj2387 Til the Cows Come Home

    解题思路:最短路的模板题,注意一个细节处理即可. 见代码: #include<cstdio> #include<cstring> #include<algorithm&g ...

  2. ORA-00257错误

    Archiver error,connect internal only,until freed   表示归档日志目录已满,用户不能再连接数据库,现有用户可继续查询数据库,但是不能执行DML语句 插删 ...

  3. 第三集 欠拟合与过拟合的概念、局部加权回归、logistic回归、感知器算法

    课程大纲 欠拟合的概念(非正式):数据中某些非常明显的模式没有成功的被拟合出来.如图所示,更适合这组数据的应该是而不是一条直线. 过拟合的概念(非正式):算法拟合出的结果仅仅反映了所给的特定数据的特质 ...

  4. MYSQL中 ENUM、SET 类型(建议用tinyint代替)

    ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串("") 或 NULL: 如果 ...

  5. selenium中处理不带ID的弹出窗口

    在selenium中虽然有selectWindow(String windowID) 方法,但是对于一些窗口很难取得其window ID的话,如果开发人员没有在html代码中提供ID ,或者getAl ...

  6. win7 下启动mysql

    1.下载mysql最新版,解压,不用安装. 2.启动服务: 进入bin文件夹下,使用管理员权限运行 mysqld.exe. 3.测试是否启动了服务. 4.登录mysql.初次安装的,没有设置密码,直接 ...

  7. 想要完全导入swc中的所有类

    其实还有个这个办法.修改参数.-include-libraries library [...] 强制导入SWC文件中的所有类,不管是否曾使用过这个类 (((比如把swc文件放到src里,然后编译参数加 ...

  8. html5 canvas防微博旋转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. UltraEdit中文乱码的解决方法

    现象问题: 同样的一个文件 UltraEdit 打开是乱码,显示文件的编码是U8-DOS,可是用EditPlus .记事本,打开,就是正常的,编码显示是ANSI. 即使在UltraEdit打开文件的时 ...

  10. compiled python files

    [compiled python files] As an important speed-up of the start-up time for short programs that use a ...