好吧,我要對此進行一次刺探,希望我能理解你的問題,而不是對你的代碼做太多的假設。我將要做的假設是這是一個全新的MVC應用程序,使用Visual Studio ASP.NET 4.6模板和「無身份驗證」選項創建(根據我瞭解的情況來判斷,您不希望存儲此數據就像剛剛從索賠中讀到的一樣)。
添加一個名爲入門級到項目
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(WebApplication1.Startup))]
namespace WebApplication1
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
}
}
現在,這是要運行,因爲你可能已經猜到的根,在「啓動」就像一個文件的global.asax.cs做。
現在我們需要實際製作ConfigureAuth()方法。這通常在App_Start文件夾中使用名爲「Startup.Auth.cs」的文件完成。這個文件將當前不存在,所以,儘管有此模板
using Owin;
using Kentor.AuthServices.Owin;
namespace WebApplication1
{
public partial class Startup
{
private void ConfigureAuth(IAppBuilder app)
{
}
}
}
創建這是我們要做我們的驗證邏輯/設置。 OWIN提供了很多開箱即用的認證策略,還有一些庫甚至更多。如果你打算自己寫,我建議你看看OwinOAuthProviders。
繼續並安裝NuGet軟件包Kentor.AuthServices.Owin軟件包和依賴項。這應該可以解決您目前的編譯錯誤。您還需要將對System.IdentityModel的引用添加到您的項目中以備後用。
現在,在Startup.Auth.cs中的ConfigureAuth方法中,您可以通過執行以下操作將Kentor添加到您的應用程序中。
Public void ConfigureAuth(IAppBuilder app)
{
var kentorOptions = new KentorAuthServicesAuthenticationOptions(true);
}
現在你的,因爲我通過它真正的,會從你的WebConfig設置讀取變量kentorOptions。你也可以在這裏手動配置它們。
我們感興趣的部分是kentorOptions.SPOptions.SystemIdentityModelIdentityConfiguration.ClaimsAuthenticationManager屬性。我們想要創建一個自定義的ClaimsAuthenticationManager來提供基於傳入聲明的身份。
請從ClaimsAuthenticationManager
using System.Security.Claims;
namespace WebApplication5 {
public class CustomClaimsAuthManager : ClaimsAuthenticationManager {
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) {
ClaimsIdentity ident = (ClaimsIdentity) incomingPrincipal.Identity;
//Use incomingPrincipal.Identity.AuthenticationType to determine how they got auth'd
//Use incomingPrincipal.Identity.IsAuthenticated to make sure they are authenticated.
//Use ident.AddClaim to add a new claim to the user
...
identity = new SomeIdentity(id, userId);
// map a claim to a specific property
identity.SomeProperty = ...Claims[IdpSomePropertyKey];
///...
GenericPrincipal newPrincipal = new GenericPrincipal(identity, null);
return newPrincipal;
}
}
}
繼承這就是你有你的身份代碼的類。現在最後我們需要將其設置爲ClaimsAuthenticationManager來實際使用,並告訴您的應用程序在OWIN管道中使用Kentor。這一切都在Startup.Auth.cs文件中。
private void ConfigureAuth(IAppBuilder app) {
var kentorOptions = new KentorAuthServicesAuthenticationOptions(true);
kentorOptions.SPOptions.SystemIdentityModelIdentityConfiguration.ClaimsAuthenticationManager = new WebApplication5.CustomClaimsAuthManager();
app.UseKentorAuthServicesAuthentication(kentorOptions);
}
Annnndd應該有希望做到這一點!對於其他驗證提供者,像OwinOAuthProviders的那些,也可以通過重寫options.Provider方法上做不同的事件的東西,像這樣的事情處理:
var cookieOptions = new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Auth/Login"),
CookieName = "cooooookiees",
ExpireTimeSpan = new TimeSpan(10000, 0, 0, 0, 0),
Provider = new CookieAuthenticationProvider {
OnException = context => {
var x = context;
},
OnValidateIdentity = async context => {
var invalidateBySecurityStamp = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(15),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager));
await invalidateBySecurityStamp.Invoke(context);
if (context.Identity == null || !context.Identity.IsAuthenticated) {
return;
}
var newResponseGrant = context.OwinContext.Authentication.AuthenticationResponseGrant;
if (newResponseGrant != null) {
newResponseGrant.Properties.IsPersistent = true;
}
}
}
};
app.UseCookieAuthentication(cookieOptions);
你試圖尋找到簡單的例子? https://github.com/valkovnet/IdentityServer,https://github.com/IdentityServer/IdentityServer2。實際上,主要的技巧是在Web.config中配置Identity Server。這將爲您提供FederatedAuthentication訪問 – deeptowncitizen
簡單的示例通常只是基於web.config的簡單配置,沒有自定義標識。我看了一下valkovnet的例子,它只是當你生成一個新項目然後在web.config中設置WIF時得到的解決方案。除非我沒有找到正確的地方,否則沒有真正的程序化配置或身份設置。 – AaronLS
這是一個OWIN應用程序嗎?你有一個App_Start文件夾嗎? –