2017-06-06 55 views

回答

1

更好的问题是how to customize the login screen? 看到the documentation on customizing views

在IdentityServer的意见,可以通过以下两种方式之一进行定制:1) 定制由DefaultViewService提供的HTML模板,或者如果 更多的控制,需要2)定义定制IViewService

实现自定义IViewServicechange the full layout。 此外,如果您只想更改登录页面,请添加您的自定义html,其实现与existing login page相同的角度逻辑,并将其添加到名为templates的文件夹中,文件名为_login.html。 如果要修改layout(标题),那么此时需要执行相同的操作,命名文件_Layout.html。 这全部在documentation中展示,上面列为“替换部分视图”。

1

这是我做到了,而无需使用IViewService

添加验证码脚本模板/ _layout.html头标记

<script src='https://www.google.com/recaptcha/api.js'></script> 

添加片断登录在模板/ _login.html屏幕页面,用加入名称= “G-验证码 - 响应” 属性

<div class="g-recaptcha" name="g-recaptcha-response" data-sitekey="your sitekey"></div> 

添加CspOptions吨Ø启动类,允许谷歌脚本

CspOptions = new CspOptions 
{ 
    Enabled = true, 
    FontSrc = "'self' data: fonts.gstatic.com", 
    StyleSrc = "'self' 'unsafe-inline' fonts.googleapis.com", 
    ScriptSrc = "'self' https://www.google.com https://www.gstatic.com; object-src 'self'", 
    FrameSrc = "https://www.google.com" 
} 

进样OwinEnvironmentService一个到UserService类 - 这将让您抓住从验证码片断

private readonly OwinEnvironmentService _environmentService; 

public UserService(OwinEnvironmentService environmentService) 
{ 
    _environmentService = environmentService; 
} 

在AuthenticateLocalAsync令牌,抢令牌和验证

var gReCaptchaResponse = _environmentService.GetLoginInput("g-recaptcha-response"); 
var client = new RestClient("https://www.google.com"); 
var request = new RestRequest("recaptcha/api/siteverify", Method.POST) { RequestFormat = DataFormat.Json }; 
request.AddParameter("secret", "YOUR SECRET"); 
request.AddParameter("response", gReCaptchaResponse); 
var response = client.Execute(request); 
var verficationStatus = JsonConvert.DeserializeObject<GReCaptcha>(response.Content); 

if(!verficationStatus.Success) 
{ 
    Logger.Warn("Captcha invalid"); 
    context.AuthenticateResult = new AuthenticateResult("Please verify that you are not a robot"); 
    return Task.FromResult(0); 
} 

GetLoginInput(形式输入名称)扩展 (credit to martinip86 from Github

public static string GetLoginInput(this OwinEnvironmentService environmentService, string fieldName) 
{ 
    const string body = "owin.RequestBody"; 
    if (!environmentService.Environment.Keys.Contains(body)) 
     return null; 

    var owinFormData = environmentService.Environment[body] as System.IO.Stream; 
    if (owinFormData == null) 
     return null; 

    var formData = string.Empty; 
    using (var sr = new System.IO.StreamReader(owinFormData)) 
    { 
     formData = sr.ReadToEnd(); 
    } 

    if (string.IsNullOrWhiteSpace(formData)) 
     return null; 

    var formDataParsed = HttpUtility.ParseQueryString(formData); 
    return formDataParsed[fieldName]; 
} 
相关问题