दिग्गजों की sholders पर स्थायी, मैं इसे इस तरह से क्रियान्वित किया है प्रमाणीकरण
के परीक्षण के लिए मज़ाक उड़ाया जा करने के लिए अनुमति देने के लिए
using System;
using System.Collections.Generic;
using Nancy;
using Nancy.Security;
namespace Your.Namespace
{
/// <summary>
/// Extensions for Nancy that implement Windows Authentication.
/// </summary>
public static class WindowsAuthenticationExtensions
{
private class WindowsUserIdentity : IUserIdentity
{
private readonly string _userName;
public WindowsUserIdentity(string userName)
{
_userName = userName;
}
#region IUserIdentity
IEnumerable<string> IUserIdentity.Claims
{
get { throw new NotImplementedException(); }
}
string IUserIdentity.UserName
{
get { return _userName; }
}
#endregion
}
#region Methods
/// <summary>
/// Forces the NancyModule to require a user to be Windows authenticated. Non-authenticated
/// users will be sent HTTP 401 Unauthorized.
/// </summary>
/// <param name="module"></param>
/// <param name="authenticationProvider"></param>
public static void RequiresWindowsAuthentication(this NancyModule module, IWindowsAuthenticationProvider authenticationProvider)
{
if (!authenticationProvider.CanAuthenticate)
throw new InvalidOperationException("An HttpContext is required. Ensure that this application is running under IIS.");
module.Before.AddItemToEndOfPipeline(
new PipelineItem<Func<NancyContext, Response>>(
"RequiresWindowsAuthentication",
context =>
{
var principal = authenticationProvider.GetPrincipal();
if (principal == null || !principal.Identity.IsAuthenticated)
{
return HttpStatusCode.Unauthorized;
}
context.CurrentUser = new WindowsUserIdentity(principal.Identity.Name);
return null;
}));
}
#endregion
}
}
IWindows प्रमाणीकरणप्रदाता:
using System.Security.Principal;
namespace Your.Namespace
{
public interface IWindowsAuthenticationProvider
{
bool CanAuthenticate { get; }
IPrincipal GetPrincipal();
}
}
WindowsAuthenticationProvider: के रूप में आप की जरूरत है IWindowsAuthenticationProvided हर मॉड्यूल
public DefaultModule(IWindowsAuthenticationProvider authenticationProvider)
{
this.RequiresWindowsAuthentication(authenticationProvider);
Get["/"] = _ => "Hello World";
}
स्रोत
2014-06-19 12:43:45
धन्यवाद, यह मेरे लिए एक बहुत मदद की। आप इसे कैसे संशोधित कर सकते हैं ताकि यह मॉड्यूल स्तर की बजाय प्रति अनुरोध है? या आप बस प्रत्येक मार्ग के भीतर व्यक्तिगत दावों की जांच करेंगे? – mjbates7
आप रूट हैंडलर के अंदर [this.RequiresAuthentication()] (https://stackoverflow.com/questions/12185257/nancyfx-authentication-per-route) जोड़ सकते हैं। –
'ओविन' में स्वयं-होस्टिंग के मामले में वास्तव में सहायक नहीं है क्योंकि आप 'SystemFeb' से जुड़े होंगे, 'कोडफॉक्स' द्वारा दिए गए उत्तर मेरी आवश्यकताओं को पूरा करते हैं। – MaYaN