22-Consent 确认逻辑实现
1-定义一个从前台传到后台的viewModel
namespace MvcCookieAuthSample.Models { public class InputConsentViewModel { public string Button { get; set; } public IEnumerable<string> ScopesConsented { get; set; } public bool RemeberConsent { get; set; } public string ReturnUrl { get; set; } } }
2-确定逻辑实现
[HttpPost] public async Task<IActionResult> Index(InputConsentViewModel viewModel) { ConsentResponse consentResponse = null; if (viewModel.Button == "no") { consentResponse = ConsentResponse.Denied; } else if (viewModel.Button == "yes") { if(viewModel.ScopesConsented!=null && viewModel.ScopesConsented.Any()) { consentResponse = new ConsentResponse { ScopesConsented=viewModel.ScopesConsented, RememberConsent = viewModel.RemeberConsent }; } } if (consentResponse != null) { var request = await _identityServerInteractionService.GetAuthorizationContextAsync(viewModel.ReturnUrl); await _identityServerInteractionService.GrantConsentAsync(request, consentResponse); return Redirect(viewModel.ReturnUrl); } return View(); }
3-前台consent/index.cshtml
@using MvcCookieAuthSample.ViewModel; @model ConsentViewModel <div class="row page-header"> <div class="col-sm-10"> @if (string.IsNullOrWhiteSpace(Model.ClientLogUrl)) { <div> <img src="@Model.ClientLogUrl" /> </div> } <h1> @Model.ClientName <small>希望使用你的账号</small> </h1> </div> </div> <div class="row"> <form method="post" asp-route-ReturnUrl="@Model.ReturnUrl"> @if (Model.IdentityScopes.Any()) { <div class="panel"> <div class="panel-heading"> <span class="glyphicon glyphicon-tasks"></span> identity应用权限 </div> <ul class="list-group"> @foreach (var scope in Model.IdentityScopes) { @await Html.PartialAsync("_ScopeListItem", scope); } </ul> </div> } @if (Model.ResourceScopes.Any()) { <div class="panel"> <div class="panel-heading"> <span class="glyphicon glyphicon-tasks"></span> resource应用权限 </div> <ul class="list-group"> @foreach (var scope in Model.ResourceScopes) { await Html.PartialAsync("_ScopeListItem", scope); } </ul> </div> } <div> <button value="yes" name="button" class="btn btn-primary" autofocus>同意</button> <button value="no" name="button" >取消</button> @if (!string.IsNullOrEmpty(Model.ClientUrl)) { <a href="@Model.ClientUrl" class="pull-right btn btn-default"> <span class="glyphicon glyphicon-info-sign" ></span> <strong>@Model.ClientUrl</strong> </a> } </div> </form> </div>
4 _scopeListItem.cshtml
@* For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 *@ @using MvcCookieAuthSample.ViewModel; @model ScopeViewModel <li> <label> <input type="checkbox" name="ScopesConsented" id="scopes_@Model.Name" value="@Model.Name" checked="@Model.Checked" disabled="@Model.Required" /> @if (Model.Required) { <input type="hidden" name="ScopesConsented" value="@Model.Name"/> } <strong>@Model.Name</strong> @if (Model.Emphasize) { <span class="glyphicon glyphicon-exclamation-sign"></span> } </label> @if (string.IsNullOrEmpty(Model.Description)) { <div> <label for="scopes_@Model.Name"> @Model.Description</label> </div> } </li>